我尝试在“jdouble *”变量中解析我从jni获得的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("\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;
}
答案 0 :(得分:1)
对于初学者:为什么所有演员?如果您正在使用JNI接口
正确地说,不需要任何演员阵容。如果我们拿第一个,
例如:如果paramObj
声明为本机中的数组
接口,传入的类型应为jobjectArray
,而不是
jobject
;如果它声明是一个对象,那么调用
关于它的GetObjectArrayElement
不应该有效。 (因为jobject
并且jobjectArray
可能是指针类型的typedef,而且
接口是extern "C"
,没有类型检查参数,你可能会
如果Java端的参数实际上是一个数组,那就远离它吧
对象。)如果我是你,我会重新检查你的所有类型。
关于奇怪的输出:您将double
与"%d"
格式匹配
说明符,需要int
。未定义的行为。放下
printf
,并使用std::cout
,问题将自行解决
自动。 (否则,请使用"%e"
,"%f"
或"%g"
作为格式
说明符。)