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

関連する問題