سؤال

لقد وجدت الكثير من البرامج التعليمية / الأسئلة حول Stackoverflow التي تتعامل مع نسخ صفائف Char من جانب C / JNI إلى شيء مثل البايت [] في جافا، ولكن ليس في الاتجاه الآخر.

أنا أستخدم مكتبة C الأصلية التي تتوقع صفيف بايت. أريد ببساطة الحصول على بيانات من البايت [] في جافا، إلى حد ما يفضل سحر غير موقعة [] في C.

قصة قصيرة طويلة: ما هي أفضل طريقة لنسخ البيانات من Jbytearray في JNI؟ هل هناك أي طريقة للكشف عن حجمها؟

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

المحلول

إليك مثالا للعمل لقد قمت للتو برفعت من مكتبة AS / 400 JNI لحل مؤشر قائمة انتظار أصلي لاختبار وجود قائمة الانتظار - فهو نسخ مكتبة قائمة الانتظار واسمها من صفيف جافا بايت (مترجم بالفعل إلى CCSID للوظائف) في الرمز الأصلي ويستخدمه. يحيط علما بمكالمات وظيفة الإصدار؛ يمكن تغيير هذه لنسخ محتويات الصفيف الأصلية مرة أخرى في صفيفات Java Byte لتحريك البيانات بالطريقة الأخرى:

JNIEXPORT jboolean JNICALL Java_com_mycompany_jni400_UserQueue_jniResolve(JNIEnv *jep,jobject thsObj,                
jbyteArray queueLibrary,jbyteArray queueName) {                                                                             
    jbyte            *lib,*nam;                                                                                             
    bool             rtn;                                                                                                   

    thsObj=thsObj;                                                                                                          
    lib=(*jep)->GetByteArrayElements(jep,queueLibrary,0);                                                                   
    nam=(*jep)->GetByteArrayElements(jep,queueName,0);                                                                      
    rtn=(usrq_resolve((byte*)lib,(byte*)nam)!=NULL);                                                                        
    (*jep)->ReleaseByteArrayElements(jep,queueLibrary,lib,JNI_ABORT); /* abort to not copy back contents */                 
    (*jep)->ReleaseByteArrayElements(jep,queueName   ,nam,JNI_ABORT); /* abort to not copy back contents */                 
    if(rtn) { return JNI_TRUE;  }                                                                                           
    else    { return JNI_FALSE; }                                                                                           
    }                                                                                                                       

نصائح أخرى

أفضل طريقة لنسخ جافا بايت [] إلى الأم char* هو استخدام GetByteArrayRegion يتصل. يفعل بالضبط ما تريد: نسخ كل أو جزء من صفيف من البايتات في المخزن المؤقت الأصلي.

استخدام GetByteArrayElements/ReleaseByteArrayElements يتطلب مكالمتين بدلا من استدعاء واحد، ويعتمد على تنفيذ VM إما بايت [] في الذاكرة (] في الذاكرة لمنع GC من تحريكه، أو يتسبب في نسخ حتى يمكن ل GC أن يتحرك الحركة الأصلية بحرية دون تعطيل الرمز الأصلي. (هذا يعني أيضا ذلك JNI_ABORT سوف يتغير إما "التراجع" أو تركها سليما، اعتمادا على ما إذا كان المخزن المؤقت مثبتا أو نسخها.)

(انظر أيضا قسم "مكالمات المنطقة" من نصائح JNI وثيقة.)

ال GetArrayLength يمكن استخدام المكالمة لتحديد حجم byte[].

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