首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何将数组从JNI返回到Java?

如何将数组从JNI返回到Java?
EN

Stack Overflow用户
提问于 2009-10-23 05:23:13
回答 4查看 98.4K关注 0票数 139

我正在尝试使用android NDK。

有没有办法将在JNI中创建的数组(在我的例子中是一个int[])返回给Java?如果是这样,请提供一个执行此操作的JNI函数的快速示例。

-Thanks

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-10-23 05:25:31

如果您已经查看了文档,并且仍然有问题,那么这些问题应该是您的初始问题的一部分。在本例中,示例中的JNI函数创建了许多数组。外部数组由一个用JNI函数NewObjectArray()创建的“Object”数组组成。从JNI的角度来看,这就是一个二维数组,一个包含许多其他内部数组的对象数组。

下面的for循环使用JNI函数NewIntArray()创建int[]类型的内部数组。如果您只想返回一个一维数组的int,那么可以使用NewIntArray()函数来创建返回值。如果您想创建一个一维数组的字符串数组,那么您可以使用NewObjectArray()函数,但要为该类使用不同的参数。

由于您希望返回一个整型数组,因此您的代码将如下所示:

代码语言:javascript
复制
JNIEXPORT jintArray JNICALL Java_ArrayTest_initIntArray(JNIEnv *env, jclass cls, int size)
{
 jintArray result;
 result = (*env)->NewIntArray(env, size);
 if (result == NULL) {
     return NULL; /* out of memory error thrown */
 }
 int i;
 // fill a temp structure to use to populate the java int array
 jint fill[size];
 for (i = 0; i < size; i++) {
     fill[i] = 0; // put whatever logic you want to populate the values here.
 }
 // move from the temp structure to the java structure
 (*env)->SetIntArrayRegion(env, result, 0, size, fill);
 return result;
}
票数 124
EN

Stack Overflow用户

发布于 2013-05-10 09:49:10

如果有人想知道如何返回String[]数组:

java代码

代码语言:javascript
复制
private native String[] data();

原生导出

代码语言:javascript
复制
JNIEXPORT jobjectArray JNICALL Java_example_data() (JNIEnv *, jobject);

本机代码

代码语言:javascript
复制
  JNIEXPORT jobjectArray JNICALL   
               Java_example_data  
  (JNIEnv *env, jobject jobj){  

    jobjectArray ret;  
    int i;  

    char *message[5]= {"first",   
                       "second",   
                       "third",   
                       "fourth",   
                       "fifth"};  

    ret= (jobjectArray)env->NewObjectArray(5,  
         env->FindClass("java/lang/String"),  
         env->NewStringUTF(""));  

    for(i=0;i<5;i++) {  
        env->SetObjectArrayElement(  
        ret,i,env->NewStringUTF(message[i]));  
    }  
    return(ret);  
  }  

来自链接:http://www.coderanch.com/t/326467/java/java/Returning-String-array-program-Java

票数 42
EN

Stack Overflow用户

发布于 2019-01-23 22:33:47

根据提出的问题,这在第一个答案中已经解释过了,我们如何通过jobjectArray传递int[]。但这里是一个示例,我们如何返回一个包含数据列表的jobjectArray。例如,当有人需要返回2D格式的数据来绘制带有x和y点的线条时,这可能会很有帮助。以下示例展示了jobjectArray如何以以下格式返回数据:

JNI的Java输入:

X个浮点的数组Arraylist

JNI输出到java:

X个浮点的jobjectArrayArraylist

代码语言:javascript
复制
    extern "C" JNIEXPORT jobjectArray JNICALL
        _MainActivity_callOpenCVFn(
                JNIEnv *env, jobject /* this */,
                jobjectArray list) {

         //Finding arrayList class and float class(2 lists , one x and another is y)
            static jclass arrayListCls = static_cast<jclass>(env->NewGlobalRef(env->FindClass("java/util/ArrayList")));
            jclass floatCls = env->FindClass("java/lang/Float");
         //env initialization of list object and float
            static jmethodID listConstructor = env->GetMethodID(arrayListCls, "<init>", "(I)V");
            jmethodID alGetId  = env->GetMethodID(arrayListCls, "get", "(I)Ljava/lang/Object;");
            jmethodID alSizeId = env->GetMethodID(arrayListCls, "size", "()I");
            static jmethodID addElementToList = env->GetMethodID(arrayListCls, "add", "(Ljava/lang/Object;)Z");

            jmethodID floatConstructor = env->GetMethodID( floatCls, "<init>", "(F)V");
            jmethodID floatId = env->GetMethodID(floatCls,"floatValue", "()F");


        //null check(if null then return)
        if (arrayListCls == nullptr || floatCls == nullptr) {
            return 0;
        }

    //     Get the value of each Float list object in the array
        jsize length = env->GetArrayLength(list);

        //If empty
        if (length < 1) {
            env->DeleteLocalRef(arrayListCls);
            env->DeleteLocalRef(floatCls);
            return 0;
        }

// Creating an output jObjectArray
    jobjectArray outJNIArray = env->NewObjectArray(length, arrayListCls, 0);

        //taking list of X and Y points object at the time of return
        jobject  xPoint,yPoint,xReturnObject,yReturnObject;

            //getting the xList,yList object from the array
            jobject xObjFloatList = env->GetObjectArrayElement(list, 0);
            jobject yObjFloatList = env->GetObjectArrayElement(list, 1);


     // number of elements present in the array object
        int xPointCounts = static_cast<int>(env->CallIntMethod(xObjFloatList, alSizeId));

        static jfloat xReturn, yReturn;
                jobject xReturnArrayList = env->NewObject(arrayListCls,listConstructor,0);
        jobject yReturnArrayList = env->NewObject(arrayListCls,listConstructor,0);

    for (int j = 0; j < xPointCounts; j++) {
            //Getting the x points from the x object list in the array
            xPoint = env->CallObjectMethod(xObjFloatList, alGetId, j);
            //Getting the y points from the y object list in the array
            yPoint = env->CallObjectMethod(yObjFloatList, alGetId, j);

//Returning jobjectArray(Here I am returning the same x and points I am receiving from java side, just to show how to make the returning `jobjectArray`)  

            //float x and y values
            xReturn =static_cast<jfloat >(env->CallFloatMethod(xPoint, floatId,j));
            yReturn =static_cast<jfloat >(env->CallFloatMethod(yPoint, floatId,j));


            xReturnObject = env->NewObject(floatCls,floatConstructor,xReturn);
             yReturnObject = env->NewObject(floatCls,floatConstructor,yReturn);

            env->CallBooleanMethod(xReturnArrayList,addElementToList,xReturnObject);


            env->CallBooleanMethod(yReturnArrayList,addElementToList,yReturnObject);
            env->SetObjectArrayElement(outJNIArray,0,xReturnArrayList);
            env->SetObjectArrayElement(outJNIArray,1,yReturnArrayList);
        __android_log_print(ANDROID_LOG_ERROR, "List of X and Y are saved in the array","%d", 3);

    }

    return outJNIArray;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1610045

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档