3

サーバーと通信する必要があるjni-client-softwareに取り組んでいます。接続を確立し、必要な情報を読み込んで、Java プログラムに返すことができます。つまり、接続が確立され、情報が無限ループで読み取られる必要があります (すべての jni 関数呼び出しで切断して再接続したくありません)。作業中の jni トレッドから Java プログラムにバイト配列を渡すことは可能ですか?

どうもありがとうございました。

敬具

トーマス

4

1 に答える 1

1

「作業中の 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);
}

これがどのように機能するかについて詳しくは、次をご覧ください。

Java Native Interface 6.0 仕様

于 2012-11-05T23:00:50.340 に答える