使用jni调用方法:错误的jni oop参数
Calling a method using jni: Bad JNI oop argument
我试图使用jni(java本机接口(调用一个方法,但在调用该方法时它崩溃了。我阅读了文档,发现我需要使用"jvalue"类型的对象作为参数,但是,我如何将jobject/j转换为jvalue?
这是我当前的代码:
jclass unsafeClass = (*env).FindClass("sun/misc/Unsafe");
jfieldID unsafeObjFieldID = (*env).GetStaticFieldID(unsafeClass, "theUnsafe", "Lsun/misc/Unsafe;");
jobject theUnsafe = (*env).GetStaticObjectField(unsafeClass, unsafeObjFieldID);
jmethodID defineClassID = (*env).GetMethodID(unsafeClass, "defineClass", "(Ljava/lang/String;[BIILjava/lang/ClassLoader;Ljava/security/ProtectionDomain;)Ljava/lang/Class;");
jsize dataSize = (*env).GetArrayLength(arr);
jbyte* data = (*env).GetByteArrayElements(arr, NULL);
jstring name = (*env).NewStringUTF("Test");
jint n0 = (jint) 0;
// In this method it crashes ._.
(*env).CallObjectMethod(theUnsafe, defineClassID, name, data, n0, dataSize, classLoader, NULL);
hs_err_pid(如果有帮助的话(:http://paste.reflex.rip/okugaluyok.go
编辑:我找到了startparam"-Xcheck:jni",现在我得到了一条小错误消息。
FATAL ERROR in native method: Bad JNI oop argument
我知道这已经过时了,但这似乎是唯一一个出现此特定错误消息的线程。我没有与OP相同的设置,但我发现当我尝试做这个时
env->CallStaticVoidMethod(jcls, mainMethod);
我也会收到同样的错误。这是为了调用我的主类的主静态方法。它还产生了相同的错误消息"Bad JNI oop argument"。
我通过创建一个新的(空的(jobjectArray来修复这个问题,并将其传递给方法,它修复了我的错误。
jobjectArray args;
args = env->NewObjectArray(0, env->FindClass("java/lang/String"), 0);
env->CallStaticVoidMethod(jcls, mainMethod, args);
(*env).CallObjectMethod(theUnsafe, defineClassID, name, data, n0, dataSize, classLoader, NULL);
这是不对的。你编的吗?不要那样做。阅读JNI规范。应该是:
env->CallObjectMethod(theUnsafe, defineClassID, name, data, n0, dataSize, classLoader, NULL);
为了完整性,在C中应该是:
(*env)->CallObjectMethod(env, theUnsafe, defineClassID, name, data, n0, dataSize, classLoader, NULL);
相关文章:
- 通过JNI传递数据数组的最快方法是什么
- c++中的oop(密码生成)
- OOP 中的单成员指针
- 为 NewObjectA() 函数创建 jvalues 的参数数组时出错 - JNI Invocation API
- 将 C# DLL 导入 C++ 以用于 JNI
- 用C++包装 Java 库 (JNI)
- 如何通过 JNI 将 C 字符串表情符号传递给 Java
- JNI从Android调用C++方法
- JVM 如何执行 JNI
- React Native (Android):无法通过 JNI 在 jobject 中返回字符串
- OOP使用不同的结构与孩子一起构建建议
- OOP 标识派生对象
- 如何将字符串数组返回到 java JNI
- JNI 日期值转换问题,在C++中获取不同的长整型值
- 标识符Class_name未定义C++ oop
- JNI,使用两个 .so 文件时出错,其中一个文件需要另一个文件
- Winapi - SetWindowLongPtr in ShutdownBlockReason创建/销毁JNI本机代码
- 返回类型在 C++ OOP 中是什么意思
- 将预编译的 C 共享库与 JNI/NDK 结合使用
- 使用jni调用方法:错误的jni oop参数