サーバーと通信する必要があるjni-client-softwareに取り組んでいます。接続を確立し、必要な情報を読み込んで、Java プログラムに返すことができます。つまり、接続が確立され、情報が無限ループで読み取られる必要があります (すべての jni 関数呼び出しで切断して再接続したくありません)。作業中の jni トレッドから Java プログラムにバイト配列を渡すことは可能ですか?
どうもありがとうございました。
敬具
トーマス
サーバーと通信する必要があるjni-client-softwareに取り組んでいます。接続を確立し、必要な情報を読み込んで、Java プログラムに返すことができます。つまり、接続が確立され、情報が無限ループで読み取られる必要があります (すべての jni 関数呼び出しで切断して再接続したくありません)。作業中の jni トレッドから Java プログラムにバイト配列を渡すことは可能ですか?
どうもありがとうございました。
敬具
トーマス
「作業中の jni トレッドから Java プログラムにバイト配列を渡すことは可能ですか?」
Java クラスの 1 つで静的メソッドを作成し、jni コード内からパラメーターを使用してこのメソッドを呼び出すことができます。ここにいくつかのコードがあります:
Java 側:
package com.mysuper.game;
public class MyApp {
public static void callMeFromJNI(byte[] data) {
// ...
}
}
およびワーカー スレッドで実行される C++ コード:
JavaVM *vm;
// use vm->AttachCurrentThread(&env, 0); in thread function to get valid JNI interface pointer, on thread end use DetachCurrentThread().
JNIEnv *env;
void myFunc() {
// some test data to send
const int len = 32;
char data[len] = {0,1,2,3,4};
jclass app = env->FindClass("com/mysuper/game/MyApp");
jmethodID sendDataToJava = env->GetStaticMethodID(app, "callMeFromJNI", "([B)V");
jbyteArray bArray = env->NewByteArray(len);
char *bytes = (char *)env->GetByteArrayElements(bArray, 0);
memcpy( bytes, data, len);
env->ReleaseByteArrayElements(bArray, bytes, JNI_ABORT);
env->CallStaticVoidMethod(app, sendDataToJava, bArray);
}
これがどのように機能するかについて詳しくは、次をご覧ください。