C++ 調用 Java 時,可以實現 Java 對象的序列化。為了實現這一目標,你需要使用 JNI (Java Native Interface) 來調用 Java 方法,并使用 Java 序列化機制將 Java 對象轉換為字節流。
以下是一個簡單的示例,展示了如何在 C++ 中調用 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();
}
}
javac MyClass.java
javah -jni MyClass
#include <jni.h>
#include <iostream>
#include <vector>
#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;
}
}
g++ -I${JAVA_HOME}/include -I${JAVA_HOME}/include/linux MyClass.cpp -o MyClass -L${JAVA_HOME}/jre/lib/amd64/server -ljvm
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++ 函數并反序列化了返回的字節流。