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