gpt4 book ai didi

java - 从 JNI 调用 main 方法失败

转载 作者:太空狗 更新时间:2023-10-29 20:42:55 24 4
gpt4 key购买 nike

我创建了一个 C++ 类,它应该通过以下方式调用 Main.main:http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/invocation.html#wp9502 .

我没有让它工作所以我跟着:http://www.coderanch.com/t/525082/CPP/create-JVM-native-code-call

和:

imp_JNI_Crea">http://www.codeproject.com/Questions/263687/Linker-error-undefined-reference-to-imp_JNI_Crea

这些都不起作用。因此,我将代码改回了 oracle 的 Invocation API 文章(第一个链接)中所说的内容。

我的 C++ 代码如下所示:

在 JNI.hpp 文件中:

#include <jni.h>
#include <windows.h>
#include <iostream>

class Jvm
{
private:
JavaVM* jvm;
JNIEnv* env;
JavaVMInitArgs jvm_args;
JavaVMOption* options;

public:
Jvm();
};

在 JNI.cpp 文件中:

Jvm::Jvm()
{
options = new JavaVMOption[3];

options[0].optionString = "-Djava.compiler=NONE";
options[1].optionString = "-Djava.class.path=C:/Users/Brandon/Documents/NetBeansProjects/Loader/build/classes";
options[2].optionString = "-verbose:class";

jvm_args.version = JNI_VERSION_1_6;
jvm_args.nOptions = 3;
jvm_args.options = options;
jvm_args.ignoreUnrecognized = false;

//JNI_GetDefaultJavaVMInitArgs(&jvm_args);
JNI_CreateJavaVM(&jvm, reinterpret_cast<void**>(&env), &jvm_args);

jclass MainClass = env->FindClass("loader.Main");


//Crashes on the next line:
jmethodID MainMethod = env->GetStaticMethodID(MainClass, "main", "([Ljava/lang/String;)V");

MessageBox(NULL, "", "", 0);

Sleep(1000);

jvm->DestroyJavaVM();
delete[] options;
}

我的 java 代码如下所示:

package loader;

public class Main {

public static void main(String[] args) {
//JavaProcess.exec(ClientApplet.class);
System.out.println("Hello!");
}
}

以及冗长的打印:

[Loaded loader.Main from file:/C:/Users/Brandon/Documents/NetBeansProjects/Loader/build/classes/]

Process returned -1073741571 (0xC00000FD) execution time : 1.730 s
Press any key to continue.

我做错了什么?为什么调用方法失败?我加载的JNI.dll来自:C:\Program Files\Java\jdk1.7.0_21\jre\bin\server\jvm.dll因为最新的Java 7u25 没有 bin\client\jvm.dll

我什至静态链接到 jvm.lib:C:\Program Files\Java\jdk1.7.0_21\lib\jvm.lib

最佳答案

jclass MainClass = env->FindClass("loader.Main");

这是错误的。在使用 JNI 函数时,您必须使用斜线而不是点,就像在方法签名中一样。

正确的代码是:

jclass MainClass = env->FindClass("loader/Main");

关于java - 从 JNI 调用 main 方法失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17357712/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com