如果它是“一个”函数调用中的一大块数据,我会推荐 JNI。
看看这个:通过 jni 接口共享输出流
文章中的片段,它将数据从 c++ 传输到 java,相反也很容易做到:
总之,从 C 语言与 Java 共享二进制数据(A/V 文件、图像等)的一般策略需要字节数组。在 C 中创建一个 Java 字节数组,如下所示:
const char[] rawData = {0,1,2,3,4,5,6,7,8,9}; //Or get some raw data from somewhere
int dataSize = sizeof(rawData);
printf("Building raw data array copy\n");
jbyteArray rawDataCopy = env->NewByteArray(dataSize);
env->SetByteArrayRegion(rawDataCopy, 0, dataSize, rawData);
并像这样将它传递给Java:
printf("Finding callback method\n");
//Assumes obj is the Java instance that will receive the raw data via callback
jmethodID aMethodId = env->GetMethodID(env->GetObjectClass(obj),"handleData","([B)V");
if(0==aMethodId) throw MyRuntimeException("Method not found error");
printf("Invoking the callback\n");
env->CallVoidMethod(obj,aMethodId, &rawDataCopy);
你会有一个看起来像这样的 Java 对象:
public class MyDataHandler {
OutputStream dataStream;
public MyDataHandler(OutputStream writeTo) { dataStream = writeTo;}
public void handleData(byte[] incomingData) { dataStream.write(incomingData); }
}
该处理程序将通过本机方法传递给 C,如下所示:
public class NativeIntegration {
public native void generateBinaryWithHandler(MyDataHandler handler);
//Here we assume response is something like a network stream
public void doCallNativeFunction(ResponseStream response) {
MyDataHandler handler = new MyDataHandler(response);
generateBinaryWithHandler(handler);
}
}
此外,您可以使用其他技术:CORBA、ASN.1(ASN.1 工具)、UDP 或 TCP