java - 通过 JNI 在 C 中创建的 JVM 不起作用

标签 java c jvm java-native-interface

我对 JNI 很陌生,现在我正在使用这个简单的 C 程序创建 JVM 并从我的 Java 项目调用 main():

#include <stdio.h>
#include <jni.h>

JNIEnv* create_vm() {
    JavaVM* jvm;
    JNIEnv* env;
    JavaVMInitArgs args;
    JavaVMOption options[1];

    args.version = JNI_VERSION_1_6;
    args.nOptions = 1;
    options[0].optionString = "-Djava.class.path=CLASSPATH"; //This isn't the actual classhpath, but you get the idea
    args.options = options;
    args.ignoreUnrecognized = JNI_FALSE;

    int ret = JNI_CreateJavaVM(&jvm, (void **)&env, &args);
    if (ret<0){
        printf("\nUnable to Launch JVM");
    } else {
        printf("\nJVM launched successfully");
    }
    return env;
}

void invoke_class(JNIEnv* env) {
    jclass UncaughtExceptionClass;
    jmethodID mainMethod;
    jobjectArray applicationArgs;
    jstring applicationArg0;

    UncaughtExceptionClass = (*env)->FindClass(env, "exceptioncatcher/ExceptionCatcher");

    mainMethod = (*env)->GetStaticMethodID(env, UncaughtExceptionClass, "main", "([Ljava/lang/String;)V");

    applicationArgs = (*env)->NewObjectArray(env, 1, (*env)->FindClass(env, "java/lang/String"), NULL);
    applicationArg0 = (*env)->NewStringUTF(env, "From C");
    (*env)->SetObjectArrayElement(env, applicationArgs, 0, applicationArg0);

    (*env)->CallStaticVoidMethod(env, UncaughtExceptionClass, mainMethod, applicationArgs);
}


int main(int argc, char **argv) {
    JNIEnv* env = create_vm();
    invoke_class( env );
}

这在运行 HelloWorld 类型的 java 代码时效果很好,但我的代码实际上设置了一个默认的未捕获异常处理程序。此处理程序会将为每个未捕获的异常收集的信息发送到一个线程,该线程将处理它们并通过电子邮件发送它们。

现在这些几乎是所有创建的类,显然,现在不会捕获很多未捕获的异常。但我使用 main() 来尝试一下:

public static void main(String[] args){
    Thread.setDefaultUncaughtExceptionHandler(new DefaultExceptionHandler());
    Integer i = null;
    i++;
}

当我简单地从 netbeans 运行它时它工作正常,但是当使用 C 应用程序时唯一出现的是“JVM 启动成功”。

谁能帮忙解决这个问题?

最佳答案

设法让它最终工作(以前从未关闭过这个问题),只需构建项目并将类路径更改为生成的 .jar。

关于java - 通过 JNI 在 C 中创建的 JVM 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11576209/

相关文章:

java - 是否有一套适用于 JDBC 的 stub /模拟在任何地方都可用?

java - 自定义数据方案上的 Android ActivityNotFoundException

c - 错误 : Duplicate symbol error in c

c - 在这个程序中数组是如何存储在内存中的?

java - 分离 Spring-WS 和 Spring-Webmvc

C 中的编译时运算符

Java 虚拟机崩溃

java - jcmd : where can I find complementary information

Java 字节码 SWAP 用于 double 和 long 值?

java - JPA 惰性属性获取自定义属性