2016-01-29 104 views
0

想與NDK一起工作,我沒有與android工作室的運氣(直到現在我沒有得到指示NDK路徑的觀點,因爲我在終端之外做了一切IDE以外的任何代碼並且沒有完成代碼) ,我切換到eclipse,這使得它更容易與jni和ndk開發工作。JNI sum 2 dimentional array

首先,我創建了一個項目,在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); 
. 
. 
.} 
+0

是'JNIEXPORT jint JNICALL Java_com_example_jninew_MainActivity_getNum( JNIEnv * env,jobject obj,jintArray arr)'真的來自'javah'的輸出嗎?因爲二維數組是數組對象的數組,所以我期望看到......,jobjectArray arr)。請參閱http://stackoverflow.com/a/6752105/4756299 –

+0

以及如何使用javah生成該文件? – yanisB

+0

您需要使用GetObjectArrayElement從int [] []中獲取每個'int []',然後GetIntArrayElements。 – fadden

回答

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; 
} 
+1

某種解釋爲什麼你相信這段代碼解決了OP的問題會很好。也就是說,GetIntArrayElements的第三個參數應該是一個'jboolean *',而不是'int'。你應該在'pos'上調用'ReleaseIntArrayElements'來確保它被取消固定。 – Michael

+0

@Michael,我對jni沒有太多的想法,而ReleaseIntArrayElements也是我的猜測,但我不太確定。你可以重新編寫我的代碼,如果你願意,這可以幫助很多 – milevyo

+0

謝謝,我開始工作。我有一個新的問題在這裏:[鏈接](http://stackoverflow.com/questions/35103879/jni-return-2d-array-c-to-java) – yanisB