2017-04-05 59 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