gpt4 book ai didi

java - JNI- FindClass 函数返回 null

转载 作者:搜寻专家 更新时间:2023-10-30 21:15:05 27 4
gpt4 key购买 nike

我有一个简单的 java 类(“MainX”),我使用 shell 脚本和 eclipse 编译它。当我调用 env->FindClass("MainX") 函数时,从脚本生成的 MainX.class 文件返回 null,而从 eclipse 生成的 MainX.class 文件返回该类,然后执行 runMainX 函数。

生成的 MainX.class 文件与 JNI C++ 可执行文件位于同一文件夹中。

MainX.java

public class MainX {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(new MainX().runMainX());
}

public String runMainX(){
return ("0.789");
}
}

JNIBinding.cpp

#define USER_CLASSPATH "."
....
....

JNIEnv* createVM (JavaVM **jvm)
{
JNIEnv *env; /* pointer to native method interface */
JavaVMInitArgs vm_args; /* JDK/JRE 6 VM initialization arguments */
JavaVMOption* options = new JavaVMOption[1]; //holds various JVM optional settings

options[0].optionString = const_cast<char*>("-Djava.class.path="USER_CLASSPATH);
vm_args.version = JNI_VERSION_1_6; //version of Java platform
vm_args.nOptions = 1;
vm_args.options = options;
vm_args.ignoreUnrecognized = false;
/* load and initialize a Java VM, return a JNI interface * pointer in env */
long status = JNI_CreateJavaVM(jvm, (void**)&env, &vm_args);

if (status == JNI_ERR){
cout << "Fail: Unable to load JVM \t Exit" << endl;
}
else if (status == JNI_OK){
cout << "CreateVM:\t\tJVM loaded successfully!" << endl ;
}

delete options;
return env;
}

....
....

float invokeMainX(JavaVM **jvm, JNIEnv *env){

jclass mainClass ; //Returns a class object from a fully-qualified name, or NULL if the class cannot be found.
jmethodID classConstructor; //Returns the method ID for an instance (nonstatic) method of a class
jobject classObject; //Constructs a new java object
jmethodID methodid;

float outcome = 0;

mainClass = env->FindClass("MainX"); //Returns a class object from a fully-qualified name, or NULL if the class cannot be found.
if (mainClass==0) return 0;
classConstructor = env->GetMethodID(mainClass, "<init>", "()V"); //Returns the method ID for an instance (nonstatic) method of a class
if (classConstructor==0) return -1;
classObject = env->NewObject(mainClass, classConstructor); //Constructs a new java object
if (classObject==0) return -2;
methodid = env->GetMethodID(mainClass, "runMainX", "()Ljava/lang/String;");
if (methodid==0) return -3;
jstring result = (jstring)env->CallObjectMethod(classObject, methodid); //returns the result of the calling method, an object

....
....
}

有人能解释一下为什么会这样吗?

感谢任何帮助。

有什么想法吗???提前致谢

最佳答案

来自JNI Documentation对于 FindClass:

name: a fully-qualified class name (that is, a package name, delimited by "/",       followed by the class name).

So assuming the class is in the package your.package.name, I guess you'll have to replace

mainClass = env->FindClass("MainX");

mainClass = env->FindClass("your/package/name/MainX");

希望这对您有所帮助!

关于java - JNI- FindClass 函数返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19113719/

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