Tôi có một lớp java đơn giản ("MainX") mà tôi biên dịch bằng cách sử dụng một kịch bản lệnh shell và nhật thực. Khi tôi gọi hàm env-> FindClass ("MainX"), tệp MainX.class được tạo ra từ tập lệnh trả về null trong khi tệp MainX.class được tạo ra từ nhật thực trả về lớp và thực hiện sau đó hàm runMainX.Hàm JNI- FindClass trả về null
Tệp MainX.class được tạo nằm trong cùng thư mục với thực thi 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
....
....
}
Ai đó có thể giải thích cho tôi tại sao điều này xảy ra?
Tôi đánh giá cao sự giúp đỡ nào.
Bất kỳ ý tưởng nào ??? Cảm ơn trước
Cảm ơn mbrenon. Tuy nhiên, tôi không có gói nào. Nó nằm trong thư mục src – STiGMa
Tôi hiểu rồi. Không có ý tưởng sau đó, tôi đang sử dụng để sử dụng JNI trong bối cảnh Android, nơi gói là bắt buộc theo như tôi biết ... – mbrenon