Разобрать нативную переменную jdouble в нативную переменную double (jni) - PullRequest
1 голос
/ 22 ноября 2011

Я пытаюсь проанализировать массив double, полученный от jni, в переменную "jdouble *".То, что я хочу сделать, это преобразовать этот массив double в массив "double *".

Он не работает и дает мне такой результат:875387864

Вот мой код:

JNIEXPORT void JNICALL Java_MainFrame_Jni_Functions_sendTablesToNative
(JNIEnv *env, jobject obj, jobject paramObj, jobject respObj, jobject objObj, jobject ConObj, jobject intConObj){

    jclass jTablObjClass = env->FindClass("MainFrame/Jni/TablesObjects");           // get jclass 


    //////////////////////////////////////////////////////////////
    jobject col, row;       // will be used to navigate within the jobjectarrays
    //************************************************************

    //////////////////////////////////////////////////////////////
    jint     paramNbRows;       // will get the parameter nb rows

    jdouble* paramValue;        //
    jdouble* paramMin;          // Define double variables for
    jdouble* paramMax;          // param : value, min, max, reference
    jdouble* paramReference;    //

    col             = env->GetObjectArrayElement((jobjectArray)paramObj, 0);    
    vector<char*>   paramName(  env->GetArrayLength((jobjectArray)col)  );      // define parameter Name Column size

    col             = env->GetObjectArrayElement((jobjectArray)paramObj, 5);    
    vector<char*>   paramType(  env->GetArrayLength((jobjectArray)col)  );      // define parameter Type Column size

    //
    paramNbRows     = env->GetArrayLength((jobjectArray)col);                   // get parameter nb rows

    col             = env->GetObjectArrayElement((jobjectArray)paramObj, 1);
    paramValue      = env->GetDoubleArrayElements((jdoubleArray)col, 0);        // get parameter value column

    col             = env->GetObjectArrayElement((jobjectArray)paramObj, 2);
    paramMin        = env->GetDoubleArrayElements((jdoubleArray)col, 0);        // get parameter min column

    col             = env->GetObjectArrayElement((jobjectArray)paramObj, 3);
    paramMax        = env->GetDoubleArrayElements((jdoubleArray)col, 0);        // get parameter max column

    col             = env->GetObjectArrayElement((jobjectArray)paramObj, 4);
    paramReference  = env->GetDoubleArrayElements((jdoubleArray)col, 0);        // get parameter reference column

    col             = env->GetObjectArrayElement((jobjectArray)paramObj, 0);
    for(int i=0; i<(env->GetArrayLength((jobjectArray)col)); i++){ 
        paramName.at(i) =  (char*)env->GetStringUTFChars(
            (jstring)env->GetObjectArrayElement( (jobjectArray)col, i), 0 );    // get parameter name column
    }

    col             = env->GetObjectArrayElement((jobjectArray)paramObj, 5);
    for(int i=0; i<(env->GetArrayLength((jobjectArray)col)); i++){ 
        paramType.at(i) =  (char*)env->GetStringUTFChars(
            (jstring)env->GetObjectArrayElement( (jobjectArray)col, i), 0 );    // get parameter name column
    }
    //************************************************************


    printf("\n\n    %s %d %d %d %d %s", 
        paramName.at(0),        (double)paramValue[0],      (double)paramMin[0], 
        (double)paramMax[0],    (double)paramReference[0],  paramType.at(0)     );



    //////////////////////////////////////////////////////////////



    jstring str = env->NewStringUTF("Test Jni from C++");
    jmethodID printMethId = env->GetStaticMethodID(jTablObjClass, "print", "(Ljava/lang/String;)V");// get jmethod
    env->CallStaticVoidMethod(jTablObjClass, printMethId,str);                                      // call jmethod

    return; 
 }

1 Ответ

1 голос
/ 22 ноября 2011

Для начала: почему все забрасывает?Если вы используете интерфейс JNI правильно, не должно быть никаких приведения.Если мы возьмем первое, например: если paramObj объявлен как массив в собственном интерфейсе, передаваемый тип должен быть jobjectArray, а не jobject;если он объявлен объектом, то вызов GetObjectArrayElement для него не должен работать.(Поскольку и jobject, и jobjectArray, вероятно, являются typedef для типов указателей, а интерфейс - extern "C", без проверки типов аргументов, вы можете обойтись без него, если параметр на стороне Java фактически является массивомобъекты.) Я бы перепроверил все ваши типы, если бы я был вами.

Что касается странного вывода: вы сопоставляете спецификатор формата double с "%d", который требует int.Неопределенное поведение.Просто наберите printf и используйте std::cout, и проблема решится автоматически.(В противном случае используйте "%e", "%f" или "%g" в качестве спецификатора формата.)

...