JNI总和2维数组

时间:2016-01-29 17:28:29

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

想要使用NDK,我没有运气android工作室(到现在为止我没有得到指示NDK路径的点,因为我在IDE之外的终端做所有事情并且没有代码完成),我切换到eclipse这使得使用jni和ndk dev更容易。

首先,我创建了一个项目来对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;
}

我的java代码是:

package com.example.jninew;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.TextView;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView textView = (TextView) findViewById(R.id.tv);
        int[][] a = {{1,2},{3,4}};
        textView.setText("sum is: "+getNum(a));


    }
    static{
        System.loadLibrary("getNum");
    }
    native int getNum(int[][] a);
.
.
.}

1 个答案:

答案 0 :(得分:0)

我认为它应该是这样的:

   #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;
}