当前位置: 首页 > 面试题库 >

从JNI调用主方法失败

巩子实
2023-03-14
问题内容

我创建了一个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");


 类似资料:
  • 我的C代码无法找到Java中的公共静态函数调用。它成功地找到了类,没有错误。 我试图将结果返回给回调方法。“5”稍后将被更复杂的内容取代。 我在StackOverflow上似乎也有类似的问题,但是到目前为止没有任何变化似乎有所帮助。也许我有逻辑错误? 我的JNI(更新#2): 此代码包含在此函数中调用的方法中: 我的Java(更新#1): 签名检查: javap-s-pcecutils 公共静态响

  • 我正在编写一些代码,以获得一个派生线程来从C调用静态Java方法。 如果放置在来自Java的本机调用中,而不是来自附加了JNIEnv的线程,则调用该方法的位可以正常工作。 我设置了一个JavaVM*如下: 这确实会被调用。 然后生成另一个线程,并从该线程执行以下操作: attachMoney tThread返回0。 GetStaticmethod虽然爆炸与以下错误: 我只是不知道我做了什么来打乱它

  • 问题内容: 因此,我正在编写一个使用大型c 库的Android应用。我可以正常工作,以便Java应用程序可以调用c 委托方法,但是我发现自己希望自己可以将来自c 的消息记录到Android日志中。从Java上这很容易,但是我不知道如何从c 调用Java方法。我的搜索找到了从c 打开jvm的方法,这根本不是我想要做的。理想情况下,我想将日志方法指针传递给c ,然后可以在需要时使用它。当然,Java不

  • 我正在制作一个库应用程序,该应用程序使用谷歌断路器检测android中的本机崩溃。每当我的主端发生本机崩溃时,断路器都会调用以下回调。从这个回调中,我需要使用JNI在java类中调用一个静态val方法。 这是我的java方法: 在Android5.0之前,这一功能一直运行良好。但在Lollipop中,我无法调用我的java方法,因为我无法在Logcat控制台上看到“内部句柄异常”日志。 以下是我在

  • 问题内容: 例如,我正在尝试做这样的事情 我收到一条错误消息,告诉我无法从静态环境中引用非静态变量。因此,如果这是真的,我将如何在main内部使用非静态方法? 问题答案: 你不能 非静态方法是必须在Test类的实例上调用的方法。创建Test的实例以在您的main方法中使用:

  • 问题内容: 我尝试在Android NDK上工作,我的第一个测试不是很确定,我需要帮助,因为我看不到错误在哪里。 以下代码可以毫无问题地进行编译,但是当在模拟器上运行时,该程序将返回SIGSEGV信号,并且在logcat中不会显式写入任何错误。但是,将显示一条警告,指出未找到Java类。经过一天的研究,这个问题看起来一切正确。 这是我的Java代码:JNITestActivity.java 这是我