【问题标题】:How to return an array from JNI to Java in Android? [duplicate]如何在Android中将数组从JNI返回到Java? [复制]
【发布时间】:2017-08-30 11:22:25
【问题描述】:

我是 JNI 和 C++ 的新手,这里我打算将一个数组从 Android 中的 Java 传递给 JNI,而在 JNI 中只需要以 Bubble 方式对数组进行排序。但是,这似乎永远不会起作用,我的意思是数组永远不会被排序。不知道是数组没传过还是JNI里面的函数有问题。

以下是演示代码。

文件.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]));
}

有什么想法吗?

【问题讨论】:

  • JNIEXPORT jstring JNICALL Java_com_jni_jniDemo_JniInterface_arraySort - 看起来您已将返回类型指定为 jstring
  • 另外,你的排序功能让我头疼。
  • @Mike M 很抱歉,这真的是我的错误!谢谢!
  • @Mike M 我编辑了我的问题!这次我又遇到了一个问题。
  • “这次我又遇到了一个问题”什么问题?你需要更具体。另外,既然您似乎使用jArr 作为输入/输出参数,为什么您的 jni 函数需要返回任何内容?

标签: java android c++ java-native-interface


【解决方案1】:

看看这里,看看如何在 JNI 中处理数组。此示例将向您展示如何来回传递数组:

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

请注意,您不想将值作为函数结果返回。当您使用 JNI_COMMIT 发布时,值在您作为参数传递的对象中可用。

【讨论】:

  • 非常感谢,我知道问题出在哪里了。
  • 太棒了!感谢您的评论。
猜你喜欢
  • 2010-12-09
  • 2012-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-28
  • 1970-01-01
  • 2018-01-19
  • 2011-09-02
相关资源
最近更新 更多