3

我正在开发一个 jni-client-software,它应该与服务器通信。我可以建立连接,可以读出我需要的信息并将其返回给我的 java 程序。现在我想无限连接,这意味着连接已经建立,并且应该在无限循环中读取信息(我不想断开连接并重新连接每个 jni 函数调用)。是否可以将字节数组从工作的 jni 踏板传递给我的 java 程序?

非常感谢。

亲切的问候

托马斯

4

1 回答 1

1

“是否可以将字节数组从工作的 jni 踏板传递给我的 java 程序?”

您可以在其中一个 java 类中创建静态方法,然后使用 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 原生接口 6.0 规范

于 2012-11-05T23:00:50.340 回答