জেএনআই থেকে জাভাতে কীভাবে অ্যারে ফিরবেন?


130

আমি অ্যান্ড্রয়েড এনডিকে ব্যবহার করার চেষ্টা করছি।

int[]JNI তে জাভাতে তৈরি করা একটি অ্যারে (আমার ক্ষেত্রে একটি ) ফেরত দেওয়ার কোনও উপায় আছে কি ? যদি তা হয় তবে দয়া করে JNI ফাংশনের একটি দ্রুত উদাহরণ সরবরাহ করুন যা এটি করবে।

-Thanks

উত্তর:


120

আপনি যদি ডকুমেন্টেশন পরীক্ষা করে থাকেন এবং এখনও এমন প্রশ্ন থাকে যা আপনার প্রাথমিক প্রশ্নের অংশ হওয়া উচিত। এই ক্ষেত্রে, উদাহরণে জেএনআই ফাংশনটি বেশ কয়েকটি অ্যারে তৈরি করে। বাইরের অ্যারেটি 'অবজেক্ট' অ্যারে সমন্বিত যা জেএনআই ফাংশন সহ তৈরি করে NewObjectArray()। জেএনআই এর দৃষ্টিকোণ থেকে, এটি দুটি দ্বিমাত্রিক অ্যারে হ'ল, এমন একটি অবজেক্ট অ্যারে যা বেশ কয়েকটি অন্যান্য অভ্যন্তরীণ অ্যারে ধারণ করে।

লুপের জন্য নিম্নলিখিতটি JNI ফাংশনটি ব্যবহার করে অভ্যন্তরীণ অ্যারেগুলি তৈরি করে যা টাইপ ইন্ট [] রয়েছে NewIntArray()। যদি আপনি কেবল একটি একক মাত্রিক অ্যারেটি ফিরিয়ে আনতে চেয়েছিলেন তবে 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;
}

হ্যাঁ, আমি এটি ইতিমধ্যে করেছি। আমার সমস্যার সাথে সম্পর্কিত উদাহরণটি বুঝতে সমস্যা হয়েছে (শেষটি), এবং আমি ভাবছিলাম যে কেউ যদি কেবল কোনও ইনট ফিরিয়ে দিয়ে সরল উদাহরণটি ব্যাখ্যা করতে মন চায় তবে []
RyanCheu

সম্পাদনা: দয়া করে আমার আগের মন্তব্যটি উপেক্ষা করুন, উপরের কোডটি কাজ করে। ধন্যবাদ! এটা খুব সহায়ক ছিল।
রায়ানচিউ 21

3
এডিআইটি 2: কোডটি কাজ করে, তবে আপনাকে পূরণ করতে সেটআপআররেজিগন (...) এ টিএমপি পরিবর্তন করতে হবে।
রায়ানচিউ 21

41

যদি কেউ জানতে চান কীভাবে স্ট্রিং [] অ্যারে ফিরিয়ে আনবেন:

জাভা কোড

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/java/Returning- স্ট্রিং- অ্যারে- প্রোগ্রাম- জাভা


0

জিজ্ঞাসিত প্রশ্নের উপর ভিত্তি করে, এটি ইতিমধ্যে প্রথম উত্তরে ব্যাখ্যা করা হয়েছে যে আমরা জবজেক্টআরয়ের মাধ্যমে কীভাবে ইনট [পাস করতে পারি]। তবে এখানে উদাহরণ রয়েছে যা আমরা কীভাবে জবজেক্টআরিতে ফিরিয়ে আনতে পারি যা ডেটার তালিকাগুলি ধারণ করে। পরিস্থিতিগুলির জন্য এটি সহায়ক হতে পারে উদাহরণস্বরূপ: যখন x এবং y পয়েন্টগুলির সাথে কিছু লাইন আঁকতে কারও কাছে 2D ফর্ম্যাটে ডেটা ফেরত আসা দরকার। নীচের উদাহরণটি দেখায় যে কীভাবে জবজেক্টআরাই নিম্নলিখিত ফর্ম্যাট আকারে ডেটা ফিরিয়ে দিতে পারে:

জেএনআই-তে জাভা ইনপুট:
অ্যারে [ Arraylistএক্স ফ্লোট পয়েন্টের] [ Arraylisty ফ্লোট পয়েন্টগুলির]

জাভাতে জেএনআই আউটপুট:
jobjectArray[ Arraylistএক্স ফ্লোট পয়েন্টের] [ Arraylisty ফ্লোট পয়েন্টগুলির]

    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;

-6

সরল সমাধান হ'ল সি থেকে কোনও ফাইলে অ্যারে ডেটা লিখুন এবং তার পরে জাভা থেকে ফাইলটি অ্যাক্সেস করুন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.