双指针Android JNI

时间:2012-12-14 15:33:28

标签: java android c java-native-interface native

我有一个获得双指针的函数

int getList(unsigned char **list); //it returns a list of something

我想知道如何将双指针从本机代码(JNI)传递给我的函数。任何人?

这是我尝试过但它不起作用。

jint Java_test_test_Activity_getList(JNIEnv *env, jobject this, jobjectArray list, jint size){
   jint count=0;
   jbyteArray bArray;
   jByteArray cList;
   count=(*env)->GetArrayLength(env, list);
    for(int i=0; i<count; i++){
       bArray[i]=(*env)->GetObjectArrayElement(env, list, i);
       (*env)->GetByteArrayRegion(env, bArray[i], 0, size, cList[i]);
     }

    return  getList(cList);
}

2 个答案:

答案 0 :(得分:0)

你不能使用'&amp;'运营商得到你的jByteArray的地址?

return  getList(&cList);

'&安培;'在C / C ++中为您提供变量的地址(指针)。您可以在指针上使用它来获取双指针。 但是我不确定jByteArray和unsigned char *之间的转换是如此简单,你可能还有别的事情要做。

答案 1 :(得分:0)

双指针通常不是什么大问题。你只需记住所有3层。

  1. 您可以直接访问变量值的图层。 (例如,int a; a = 3;)
  2. 此图层将保留指向您之前定义的变量的指针。 (例如int * p =&amp; a;)
  3. 最后一层是指针指向另一个指针的位置。 (例如int * p2 =&amp; p)
  4. 所以我们假设我们处于第3级,我们正在使用指针p2。

    1. * p2会给我们指针p。
    2. 现在我们只需要取消引用p来获取a,所以* p会给我们a的值。
    3. 所以为了保持一个双指针,你需要返回最低层的指针。 (例如(&amp;(&amp; a)))

      如上所述,为了达到你需要解除引用的价值两倍。 (例如*(* ptr))

      为什么要尝试将jobjectArray元素存储到jByteArray元素中?

      bArray[i]=(*env)->GetObjectArrayElement(env, list, i);
      

      此外,代替jByteArray cList,您可以直接使用C / C ++等价物,但这可能与修复错误无关。