将数组从JNI传递到Java

时间:2014-07-28 09:15:34

标签: java android c java-native-interface

我想访问从JNI到Java的数组(通过创建共享库libtest.so文件)
我这样做如下:

JNI代码(C)

int size = 5;                              /* Array Size */
char sample_arr[size] = {1, 2, 3, 4, 5};   /* Array to be accessed in Java */

jbyteArray result_arr = (*env)->NewByteArray(env, size);
(*env)->SetByteArrayRegion(env, result_arr, 0, size, sample_arr);

jmethodID mid = (*env)->GetMethodID(env, cls, "callback", "(I)V");
(*env)->CallVoidMethod(env, obj, mid, get_event);

我相信JNI中的jbyte是等价的 编译上面的代码以形成共享对象libtest.so

Java代码

public class Callbacks 
{
    char result_arr[];
    public void Callbacks() {
        System.loadLibrary("test");      /* Load the Shared Object */
    }

    public void callback(int get_event) 
    {
        ....
        Log.d(TAG, "Received Array at Java: result_arr[] : "+Arrays.toString(result_arr));
        ....
    }
}

输出

D/[JNI] (3106): Recieved Array at Java: result_arr[] : null

输出应为:1, 2, 3, 4, 5,但我得到null

这是访问阵列的正确方法吗? 请指出任何错误。

我是java的新手,也是JNI的初学者。虽然精通C语言 我很感激任何帮助。

1 个答案:

答案 0 :(得分:0)

您是如何将结果_arr数组从JNI发送回Java的呢?我不确定get_event参数是什么,但它绝对不是对result_arr的引用。您应该执行以下两项操作中的一项:A)向回调添加第二个参数并将result_arr传递回Java,或者B)从JNI中设置Call​​backs.result_arr实例变量购买获取该类,然后获取field ID那个班。如果您需要更多帮助,则需要发布更完整的代码。