如果是在“一个”函数调用中有大量数据,我建议使用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);
public void doCallNativeFunction(ResponseStream response) {
MyDataHandler handler = new MyDataHandler(response);
generateBinaryWithHandler(handler);
}
}
此外,您还可以使用其他技术:
CORBA、ASN.1(ASN.1 工具)、UDP 或 TCP