Android:将数据从jni线程传递到java程序

时间:2012-11-05 20:42:30

标签: android java-native-interface

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

非常感谢。

亲切的问候

托马斯

1 个答案:

答案 0 :(得分: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 Native Interface 6.0 Specification