0

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

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);
}
4

2 回答 2

0

你不能使用'&'运算符来获取你的jByteArray的地址吗?

return  getList(&cList);

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

于 2012-12-14T15:48:55.037 回答
0

双指针通常没什么大不了的。你只需要记住所有 3 层。

  1. 您可以直接访问变量值的层。(例如int a;a = 3;)
  2. 该层将保留指向您先前定义的变量的指针。(例如 int *p = &a;)
  3. 最后一层是一个指针指向另一个指针的地方。(例如 int *p2 = &p)

所以让我们假设我们在第 3 层并且我们正在使用指针 p2。

  1. *p2 将给我们指针 p。
  2. 现在我们只需要取消对 p 的引用就可以得到 a,所以 *p 会给我们 a 的值。

因此,为了保留某个东西的双指针,您需要返回最低层的指针。(例如 (&(&a)))

如前所述,为了获得您需要取消引用两次的值。(例如 *(*ptr) )

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

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

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

于 2012-12-15T01:18:31.040 回答