Если это большой кусок данных при вызове одной функции, я бы порекомендовал JNI.
Взгляните на это: Совместное использование выходных потоков через интерфейс jni
Фрагмент из статьи, он переносит данные из c ++ в java, обратное тоже легко сделать:
В целом, общая стратегия совместного использования двоичных данных (A / V-файлов, изображений и т. Д.) Из C с Java требует использования байтовых массивов. Вы создаете байтовый массив Java в C следующим образом:
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 tool ), UDP или TCP