将jdouble*本机变量解析为double*本机变量(jni)

Parse a jdouble* native variable to a double* native variable (jni)

本文关键字:变量 本机 jni double jdouble      更新时间:2023-10-16

我尝试解析从jni中获得的"jdouble*"变量的double数组。我要做的是把这个double数组转换成"double*"数组

它不起作用,并给我一个结果:

X0 875387640 875387816 959506832 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("nn    %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; 
 }

首先:为什么要进行所有类型转换?如果您正在使用JNI接口正确地说,应该不需要任何强制转换。如果我们取第一个,例如:如果paramObj在本机中声明为数组接口时,传入的类型应该是jobjectArray,而不是jobject;如果声明为对象,则调用GetObjectArrayElement在上面不应该起作用。(因为两个jobjectjobjectArray可能是指针类型的类型定义,而接口是extern "C",没有参数的类型检查,您可以如果Java端的参数实际上是一个数组,那么就不必这样做了的对象)。如果我是你,我会重新检查你所有的类型。

关于奇怪的输出:您正在匹配double"%d"格式指定符,它需要一个int。未定义的行为。就下降printf,并使用std::cout,问题将自行解决自动。(否则,请使用"%e""%f""%g"作为格式说明符。)