C JNI和2维数组

C JNI和2维数组,c,arrays,android-ndk,java-native-interface,native,C,Arrays,Android Ndk,Java Native Interface,Native,想要使用NDK,我在android studio上没有运气(到目前为止,我还没有找到指示NDK路径的要点,因为我在IDE之外的终端上做所有事情,并且没有代码完成),我切换到eclipse,这使得使用jni和NDK开发更容易 首先,我创建了一个项目,用c对一个2d整数数组求和,并将该和返回到java端。我不能让它工作。你能帮忙吗 我的C代码是: #include <jni.h> JNIEXPORT jint JNICALL Java_com_example_jninew_MainAc

想要使用NDK,我在android studio上没有运气(到目前为止,我还没有找到指示NDK路径的要点,因为我在IDE之外的终端上做所有事情,并且没有代码完成),我切换到eclipse,这使得使用jni和NDK开发更容易

首先,我创建了一个项目,用c对一个2d整数数组求和,并将该和返回到java端。我不能让它工作。你能帮忙吗

我的C代码是:

 #include <jni.h>
JNIEXPORT jint JNICALL Java_com_example_jninew_MainActivity_getNum(JNIEnv *env, jobject obj, jintArray arr)
{
  int i,j, sum = 0;
  jsize width = (*env)->GetArrayLength(env, arr);
  jintArray *line = (*env)->GetIntArrayElements(env, arr, 0);
   for (i=0; i<width; i++){

       jint *pos = (*env)->GetIntArrayElements(env, line, i);
       for (j=0; j<height; j++){
               sum += pos[i][j];
          }
   }
   (*env)->ReleaseIntArrayElements(env, arr, line, 0);
     return sum;
}

我认为应该是这样的:

   #include <jni.h>
JNIEXPORT jint JNICALL Java_com_example_jninew_MainActivity_getNum(JNIEnv *env, jobject obj, jintArray arr)
{
  int i,j, sum = 0;
  jsize width = (*env)->GetArrayLength(env, arr);

   for (i=0; i<width; i++){

        jintArray *line =   (*env)->GetObjectArrayElement(env, arr, i);
        int height =       (*env)->GetArrayLength(env, line);
        jint *pos = (*env)->GetIntArrayElements(env, line, 0);

        for (j=0; j<height; j++){
               sum += pos[j];
          }
        (*env)->ReleaseIntArrayElements(env, arr, pos, 0);
        (*env)->ReleaseIntArrayElements(env, arr, line, 0);
   }


     return sum;
}
#包括
JNIEXPORT jint JNICALL Java_com_示例_jninew_main activity_getNum(JNIEnv*env、jobject obj、jintArray arr)
{
int i,j,和=0;
jsizewidth=(*env)->GetArrayLength(env,arr);
对于(i=0;IGETOBJECTARRAYLENT(env,arr,i);
int height=(*env)->GetArrayLength(env,line);
jint*pos=(*env)->GetIntArrayElements(env,line,0);
对于(j=0;jreleaseintarayelements(环境、arr、位置,0);
(*env)->发布协议(env,arr,行,0);
}
回报金额;
}

JNIEXPORT jint JNICALL Java\u com\u example\u jninew\u main activity\u getNum(JNIEnv*env,jobject obj,jintArray arr)
真的是
javah
的输出吗?我希望看到
..,jobjectArray arr)
因为二维数组是数组对象的数组。请参阅,如何使用javah生成该文件?您需要使用GetObjectArrayElement从
int[]中获取每个
int[]
,然后获取有关该函数的配置。@yanisB以及我如何使用javah生成该文件?您首先是如何使用
javah
为本机函数生成正确的签名的?我认为
sum+=pos[I][j];
是错误的,应该是
sum+=pos[j]
某种解释,解释一下为什么你认为这段代码解决了OP的问题会很好。也就是说,
GetIntArrayElements
的第三个参数应该是
jboolean*
,而不是
int
。你可能应该在
pos
上调用
ReleaseIntArrayElements
,以确保它不被锁定。@Michael,我对jni不太了解,而ReleaseIntArrayElements也是我的猜测,但我不太确定。如果你愿意,你可以重新编辑我的代码,这对我很有帮助。Hanks,我要开始工作了。我这里有一个新问题:@milevyo…你能帮我解决上面链接中的新问题吗?
   #include <jni.h>
JNIEXPORT jint JNICALL Java_com_example_jninew_MainActivity_getNum(JNIEnv *env, jobject obj, jintArray arr)
{
  int i,j, sum = 0;
  jsize width = (*env)->GetArrayLength(env, arr);

   for (i=0; i<width; i++){

        jintArray *line =   (*env)->GetObjectArrayElement(env, arr, i);
        int height =       (*env)->GetArrayLength(env, line);
        jint *pos = (*env)->GetIntArrayElements(env, line, 0);

        for (j=0; j<height; j++){
               sum += pos[j];
          }
        (*env)->ReleaseIntArrayElements(env, arr, pos, 0);
        (*env)->ReleaseIntArrayElements(env, arr, line, 0);
   }


     return sum;
}