java - 使用jni调用方法 : Bad JNI oop argument

标签 java c++ java-native-interface

我正在尝试使用 jni(java native 接口(interface))调用一个方法,但是当我调用该方法时它崩溃了。我阅读了文档,所以我发现我需要使用“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

编辑:我找到了启动参数“-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);

关于java - 使用jni调用方法 : Bad JNI oop argument,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40271368/

相关文章:

Java - 将图像转换为 Base64

java - map 不接受子类

c++ - 将对象指针保存在 STL 容器中而不是对象本身更好吗?

c++ - 代码正在打印对象的内存位置而不是对象本身

java - 如何使用 Opencv 将 PNG 从 Java 类传递到 Android 中的 Native 类

java.lang.UnsatisfiedLinkError : org. thotheolh.jche.NativeBridge.loadPKCS11Module(Ljava/lang/String;)V

java - 图标图像加载速度不够快

java - 需要帮助使用 SingleFrameApplication 来保存 session

c++ - Qt - 如何测试 QTableWidget 项目的文本是否为整数?

java - 在 JNI 中,如何从 native 代码访问静态 Java 变量