سؤال

وأنا محاولة لاستخدام الروبوت NDK.

هل هناك طريقة للعودة مجموعة (في حالتي وint[]) التي تم إنشاؤها في JNI إلى جافا؟ إذا كان الأمر كذلك، يرجى تقديم مثال سريع وظيفة JNI التي من شأنها أن تفعل هذا.

و-بفضل

هل كانت مفيدة؟

المحلول

إذا كنت قد درست الوثائق والتي لا تزال الأسئلة التي يجب أن تكون جزءا من السؤال الأولي. في هذه الحالة، فإن وظيفة JNI في المثال بإنشاء عدد من المصفوفات. وتتألف مجموعة الخارجي للمجموعة "كائن" خلق مع وظيفة NewObjectArray() JNI. من وجهة نظر JNI، هذا كل اثنين صفيف الأبعاد هي، مجموعة كائن يحتوي على عدد من صفائف الداخلية الأخرى.

وفيما يلي لحلقة يخلق صفائف الداخلية التي هي من نوع int [] باستخدام وظيفة NewIntArray() JNI. إذا أردت فقط لإرجاع صفيف الأبعاد واحدة من [إينتس]، ثم وظيفة NewIntArray() هو ما كنت تستخدم لخلق قيمة الإرجاع. إذا أردت إنشاء مجموعة الأبعاد واحدة من سلاسل ثم كنت تستخدم الدالة NewObjectArray() لكن مع معلمة مختلفة للفئة.

ومنذ كنت ترغب في إرجاع صفيف كثافة العمليات، ثم الشفرة سوف ننظر بشيء من هذا القبيل:

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;
}

نصائح أخرى

واذا كان هناك من يود أن يعرف كيفية إرجاع سلسلة [] مجموعة:

وكود جافا

private native String[] data();

وتصدير الأصلي

JNIEXPORT jobjectArray JNICALL Java_example_data() (JNIEnv *, jobject);

والتعليمات البرمجية الأصلية

  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/ جافا / زيارات سلسلة-صفيف برنامج جافا

وبناء على السؤال المطروح، وهذا ما سبق في الجواب الأول أن كيف يمكننا تمرير كثافة [] عبر jobjectArray. ولكن هنا هو مثال كيف يمكننا إرجاع jobjectArray الذي يحتوي على قوائم البيانات. هذا يمكن أن تكون مفيدة لحالات على سبيل المثال: عندما يحتاج شخص لإرجاع البيانات في شكل 2D إلى استخلاص بعض تمشيا مع x و نقاط ذ. يظهر المثال التالي كيف يمكن لjobjectArray يمكن إرجاع البيانات في شكل الشكل التالي:

والمدخلات جافا إلى JNI:
مجموعة [Arraylist من النقاط س تعويم] [Arraylist من النقاط تعويم ص]

والانتاج JNI إلى جافا:
jobjectArray [Arraylist من النقاط س تعويم] [Arraylist من النقاط تعويم ص]

    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;

والحل بسيط هو أن كتابة البيانات مجموعة في ملف من C، ومن ثم الوصول إلى الملف من جاوة

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top