为 NewObjectA() 函数创建 jvalues 的参数数组时出错 - JNI Invocation API
Error creating args array of jvalues for NewObjectA() function - JNI Invocation API
我正在尝试通过使用JNI调用API调用NewObjectA((函数来创建C++中的jobject。但是,我不确定如何将参数传递到构造函数中。JNI API 文档指出:
jobject NewObjectA(JNIEnv *env, jclass clazz,jmethodID methodID, const jvalue *args(;
新对象A
程序员将所有要传递给 紧跟在 方法标识参数。NewObjectA(( 接受此数组中的参数, 反过来,将它们传递给程序员的 Java 方法 希望调用。
在我的例子中,构造函数需要传递给它两个java字符串。因此,我尝试了以下方法:
jclass jcls_File = env->FindClass("java/io/File");
jmethodID File_constructor = env->GetMethodID(jcls_File, "<init>","(Ljava/lang/String;Ljava/lang/String;)V");
jstring home = ctojstring(env,"/home/workspace");
jstring filename = ctojstring(env,"mydatafile");
jvalue FileLocationParams[] = {home,filename}; // COMPILE ERROR HERE.
jobject MyDataFile = env->NewObjectA(jcls_File, File_constructor,FileLocationParams);
其中 ctojstring 只是以下函数:
jstring ctojstring(JNIEnv *env,std::string mystring){
return env->NewStringUTF(mystring.c_str());
}
但是当我尝试编译时,我在 Eclipse 中收到以下错误:
错误:从"jstring {aka _jstring*}"到"jboolean {aka unsigned char}"的转换无效 [-permissive]
关于为什么会发生这种情况的任何想法?
jvalue
的类型为并集。
声明如下:
typedef union jvalue {
jboolean z;
jbyte b;
jchar c;
jshort s;
jint i;
jlong j;
jfloat f;
jdouble d;
jobject l;
} jvalue;
如果要将jstring
分配给jvalue
可以执行以下操作。
jvalue FileLocationParams[2];
FileLocationParams[0].l = home;
FileLocationParams[1].l = filename;
而不是
jvalue FileLocationParams[] = {home,filename}; // COMPILE ERROR HERE.
因为它将尝试将home
和filename
分配给jvalue
的第一个成员,这是jboolean z
.
相关文章:
- 使用 thread 类在 C++ 中构造线程的动态数组时出错
- 将链表转换为指针数组时出错
- 为 NewObjectA() 函数创建 jvalues 的参数数组时出错 - JNI Invocation API
- 基于数组的列表 - 动态数组创建时出错
- 从斐波那契序列 c++ 中的数组中查找正确的元素时出错
- 分段 使用 MPI_Gather 收集字符数组时出错
- 读取字符串字符时出错 - 对于数组中的字符串值
- 声明数组>> int arr[] 时出错;在C++(虽然在 Java 中有效)?
- 在 c++ 中返回一维数组时出错
- 将 2D 数组传递给 C++ 中的函数时出错
- 在 c++ 上创建动态数组时出错
- 尝试返回指向 Visual Studio 中的动态数组的指针时出错C++
- 将 find_if() 与数组一起使用的代码段中出错
- 在比较特定输入中的程序的数组中出错
- 分段 填充数组时出错
- 数组作为函数参数查找数组长度时出错
- 读取结构数组时出错
- 将数组指针传递到函数时出错
- C++将指针数组传递给函数指针数组时出错
- 在数组中插入数据时出错 - 数组下标'int[int]'的类型无效