将jdouble*本机变量解析为double*本机变量(jni)
Parse a jdouble* native variable to a double* native variable (jni)
我尝试解析从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
在上面不应该起作用。(因为两个jobject
和jobjectArray
可能是指针类型的类型定义,而接口是extern "C"
,没有参数的类型检查,您可以如果Java端的参数实际上是一个数组,那么就不必这样做了的对象)。如果我是你,我会重新检查你所有的类型。
关于奇怪的输出:您正在匹配double
到"%d"
格式指定符,它需要一个int
。未定义的行为。就下降printf
,并使用std::cout
,问题将自行解决自动。(否则,请使用"%e"
、"%f"
或"%g"
作为格式说明符。)
相关文章:
- 从C++本机插件更新Vector3数组
- GCC本机矩阵运算库
- VC++本机单元测试,找不到调试符号
- 在这种情况下,java对象是否可以调用本机函数
- PC中的程序和PHONE中的本机描述应用程序之间的数据连接
- 为什么导入Mixed native/CLR lib.dll的本机C++应用程序没有在Mixed lib.dll中的外部变
- 无法将标准库导入本机 android 项目中的头文件
- 使用本机 C++ 应用程序中的 C# 代码
- 在nodejs中使用本机代码的最佳方法是什么?
- 如何告诉本机节点模块所需的dll存储在哪里?
- 在自定义程序中使用本机 Windows 自然顺序排序
- 如何在C++非托管/本机 DLL 中从注册免费 COM C# 托管 DLL 创建 COM 对象
- 在使用该名称创建变量后调用本机 C 函数
- 各种数据类型的变量如何存储在C++(本机)二进制文件中
- 通过静态变量从本机代码访问有状态托管对象
- 如何使用本机代码以编程方式查找Java本地变量的内存地址
- 将托管的c#out变量与非托管的本机c++接口
- 调用本机(DLL)代码从Java使用JNI保持变量c++初始化每个新的召回函数
- 将jdouble*本机变量解析为double*本机变量(jni)
- 如何同时在本机 dll 中返回整数和字符 * 变量C++?