建立jvm已經沒有問題了 java
#include <stdio.h> #include <jni.h> #include <stdlib.h> int main() { // 定義用到的變量 int res; JavaVM *jvm; JNIEnv *env; JavaVMInitArgs vm_args; JavaVMOption options[3]; vm_args.version; // 設置初始化參數 options[0].optionString = "-Djava.compiler=NONE"; // classpath有多個時,用";"分隔,UNIX下以":"分割。 options[1].optionString = "-Djava.class.path=F:\Practice\jni\bin"; // 用於跟蹤運行時的信息 options[2].optionString = "-verbose:jni"; // 版本號設置不能漏 vm_args.version = JNI_VERSION_1_6; vm_args.nOptions = 3; vm_args.options = options; vm_args.ignoreUnrecognized = JNI_TRUE; // 1.初始化虛擬機 res = JNI_CreateJavaVM(&jvm, (void**)&env, &vm_args); if (res < 0) { fprintf(stderr, "Can't create Java VM\n"); exit(1); } // 2.獲取類 jclass cls = env->FindClass("jni/test/Demo"); // 3.獲取類的方法 jmethodID mid= env->GetMethodID(cls,"getMessage","()Ljava/lang/String;"); // 獲取Java的構造方法 jmethodID con=env->GetMethodID(cls,"<init>","(Ljava/lang/String;)V"); jstring strinit = env->NewStringUTF("Still is coding!"); jvalue arg[1]; arg[0].l = strinit; //env->AllocObject(cls); // 4.建立類的對象 jobject obj = env->NewObjectA(cls,con,arg); // 調用對象的方法 jstring msg = (jstring)env-> CallObjectMethod(obj, mid); //cout<<msg<<endl; char *str=(char *)env->GetStringUTFChars(msg,JNI_FALSE); printf("%s===",str); // 5.退出虛擬機 jvm->DestroyJavaVM(); fprintf(stdout, "Java VM destory.\n"); return 0; }
關於錯誤的處理: jvm
一,找不到頭文件 spa
解決方法, code