「1 つの」関数呼び出しで大量のデータを処理する場合は、JNI をお勧めします。
これを見てください: jni インターフェースを介して出力ストリームを共有する
記事のスニペット。C++ から Java にデータを転送します。逆も簡単です。
全体として、C からのバイナリ データ (A/V ファイル、画像など) を Java と共有するための一般的な戦略には、バイト配列が必要です。次のように 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 などの他のテクノロジを使用することもできます。