ارسال و دریافت ByteArray به JNI و برعکس - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

ارسال و دریافت ByteArray به JNI و برعکس

0 امتیاز
قصد دارم ByteStream را هم از سمت جاوا به c++ ارسال کنم و هم از سمت c++ به جاوا.
سوال شده اردیبهشت 16, 1399  بوسیله ی ٍEydi (امتیاز 68)   5 14 16

2 پاسخ

+3 امتیاز
 
بهترین پاسخ

من به صورت زیر فقط باید از سمت java به صورت آرایه پاس بدید. این متدهای سمت jni از یک کلاس Utility خودم هستش.

td::vector<char> Utility::j2CByteArray(JNIEnv * env,jbyteArray jba){
   std::vector<char> result;

    unsigned char * isCopy;
    jbyte* jbae = env->GetByteArrayElements(jba, isCopy);
    jsize len = env->GetArrayLength(jba);
    char * imageSource = (char *)jbae;

    for (int i = 0; i < len; i++)
        result.push_back(imageSource[i]);


   return result;
}
std::vector<float > Utility::j2CFloatArray(JNIEnv * env,jfloatArray jba){
    std::vector<float> result;

    unsigned char * isCopy;
    jfloat * jbae = env->GetFloatArrayElements(jba, isCopy);
    jsize len = env->GetArrayLength(jba);
    float * imageSource = (float *)jbae;

    for (int i = 0; i < len; i++)
        result.push_back(imageSource[i]);


    return result;
}


jbyteArray Utility::c2JByteArray(JNIEnv * env,std::vector<char> arr){
    jbyte* buff = new jbyte[arr.size()];
    jbyteArray result = env->NewByteArray(arr.size());
    for (int i = 0; i < arr.size(); i++) {
        buff[i] = (jbyte)arr[i];
    }
    env->SetByteArrayRegion(result, 0, arr.size(), buff);
    return result;
}

jfloatArray Utility::c2JFloatArray(JNIEnv * env,std::vector<float> arr) {
    jfloat * buff = new jfloat[arr.size()];
    jfloatArray result = env->NewFloatArray(arr.size());
    for (int i = 0; i < arr.size(); i++) {
        buff[i] = (jfloat)arr[i];
    }
    env->SetFloatArrayRegion(result, 0, arr.size(), buff);
    return result;

}

 

سیگنیچر در سمت جاوا هم به صورت مثلا float[] و یا char[] باشه.

پاسخ داده شده اردیبهشت 17, 1399 بوسیله ی farnoosh (امتیاز 8,362)   20 44 59
انتخاب شد اردیبهشت 22, 1399 بوسیله ی ٍEydi
+2 امتیاز

به این صورت هم میشه استفاده کرد.


extern  "C" JNIEXPORT void JNICALL
Java_com_passArray(
        JNIEnv *env,
        jobject obj,
        jfloatArray param) {

    int len = env->GetArrayLength(param);
    std::vector<float> param_c(len);
    env->GetFloatArrayRegion(param, 0, len, (jfloat *)param_c.data());





}

 

پاسخ داده شده مهر 17, 1399 بوسیله ی عباس مولایی (امتیاز 2,754)   1 5 13
...