C++ 调用 Java 时,可以实现 Java 对象的序列化。为了实现这一目标,你需要使用 JNI (Java Native Interface) 来调用 Java 方法,并使用 Java 序列化机制将 Java 对象转换为字节流。
以下是一个简单的示例,展示了如何在 C++ 中调用 Java 方法并序列化 Java 对象:
- 首先,创建一个 Java 类并实现序列化接口:
import java.io.Serializable; public class MyClass implements Serializable { private String name; private int age; public MyClass(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public byte[] serialize() throws Exception { java.io.ObjectOutputStream oos = new java.io.ObjectOutputStream(new java.io.ByteArrayOutputStream()); oos.writeObject(this); oos.close(); return ((java.io.ByteArrayOutputStream) oos.getOutputStream()).toByteArray(); } }
- 编译 Java 类并生成头文件:
javac MyClass.java javah -jni MyClass
- 创建一个 C++ 文件,实现 JNI 函数:
#include
#include
#include
#include "MyClass.h"
extern "C" JNIEXPORT jbyteArray JNICALL
Java_MyClass_serialize(JNIEnv *env, jobject obj) {
try {
MyClass myClassInstance("John Doe", 30);
jbyteArray byteArray = env->CallObjectMethod(obj, env->GetMethodID(env->GetObjectClass(obj), "serialize", "()Ljava/lang/byte;"));
return byteArray;
} catch (const std::exception &e) {
std::cerr << "Error: " << e.what() << std::endl;
return nullptr;
}
}
- 编译 C++ 文件并链接 Java 库:
g++ -I${JAVA_HOME}/include -I${JAVA_HOME}/include/linux MyClass.cpp -o MyClass -L${JAVA_HOME}/jre/lib/amd64/server -ljvm
- 在 Java 中调用 C++ 函数:
public class Main { static { System.loadLibrary("MyClass"); } public native byte[] serialize(); public static void main(String[] args) { Main main = new Main(); byte[] serializedObject = main.serialize(); if (serializedObject != null) { // Deserialize the object in Java try { java.io.ObjectInputStream ois = new java.io.ObjectInputStream(new java.io.ByteArrayInputStream(serializedObject)); MyClass deserializedObject = (MyClass) ois.readObject(); ois.close(); System.out.println("Deserialized object: " + deserializedObject.getName() + ", " + deserializedObject.getAge()); } catch (Exception e) { e.printStackTrace(); } } } }
在这个示例中,我们创建了一个名为 MyClass
的 Java 类,实现了序列化接口。然后,我们在 C++ 中编写了一个名为 serialize
的 JNI 函数,该函数创建了一个 MyClass
实例并将其序列化为字节流。最后,在 Java 中,我们调用了这个 C++ 函数并反序列化了返回的字节流。