2017-04-05 56 views
0

我是JNI和C++的新手,在這裏我要將Android中的Java數組傳遞給JNI,而JNI只需要以Bubble的方式對數組進行排序。然而,似乎這從來沒有得到工作,我的意思是數組永遠不會被排序。我不知道該數組是否從未被傳入,或者JNI中的函數有問題。如何在Android中將數組從JNI返回到Java?

以下是演示代碼。

文件.H

/* DO NOT EDIT THIS FILE - it is machine generated */ 
#include <jni.h> 
/* Header for class com_jni_jniDemo_JniInterface */ 

#ifndef _Included_com_jni_jniDemo_JniInterface 
#define _Included_com_jni_jniDemo_JniInterface 
#ifdef __cplusplus 

extern "C" { 
#endif 

/* 
* Class:  com_jni_jniDemo_JniInterface 
* Method: getString 
* Signature:()Ljava/lang/String; 
*/ 

JNIEXPORT jintArray JNICALL Java_com_jni_jniDemo_JniInterface_arraySort 
(JNIEnv *, jobject, jintArray); 

#ifdef __cplusplus 
} 
#endif 
#endif 

文件的.cpp

int sort(int &a, int &b){ 
    a = a + b; 
    b = a - b; 
    a = a - b; 
} 

JNIEXPORT jintArray JNICALL 
Java_com_jni_jniDemo_JniInterface_arraySort(JNIEnv *env, jobject obj, jintArray jArr) { 

    jint *arr = env -> GetIntArrayElements(jArr, 0); 
    int len = env -> GetArrayLength(jArr); 

    for(int i = 0; i < len; i++){ 
     for(int j = 0; j < len - i -1; j++){ 
      if(arr[j] > arr[j + 1]){ 
       sort(arr[j], arr[j + 1]); 
      } 
     } 
    } 

    env -> ReleaseIntArrayElements(jArr, arr, JNI_COMMIT); 

    return jArr; 
} 

文件的.java

private int[] array = {7, 34, 2, 44, 6, 0, 127, 9}; 
private int[] newArray;  

for(int i = 0; i < array.length; i++){ 
    System.out.println("Before sort:" + String.valueOf(array[i])); 
} 

jniInterface = new JniInterface(); 
newArray = jniInterface.arraySort(array); 

for(int j = 0; j < newArray.length; j++){ 
    System.out.println("After sort:" + String.valueOf(newArray[j])); 
} 

任何想法?

+1

'JNIEXPORT jstring JNICALL Java_com_jni_jniDemo_JniInterface_arraySort' - 看起來您已經獲得了指定爲'jstring'的返回類型。 –

+0

另外,你的排序功能會讓我的頭部受傷。 – MuertoExcobito

+1

@Mike M我很抱歉,這真的是我的錯!謝謝! –

回答

0

看看這裏看看如何處理JNI中的數組。此示例將告訴您如何通過陣列來回:

http://jnicookbook.owsiak.org/recipe-No-013/

注意,你不想爲函數結果返回的值。當您使用JNI_COMMIT進行發佈時,值已在您作爲參數傳遞的對象中可用。

+0

非常感謝,我知道現在的問題在哪裏。 –

+0

太棒了!感謝您的評論。 – mko