我想熟悉JNI API,但無法獲得一個示例C++程序來編譯。我得到了相同的樣本來編譯和運行在Linux中(在下面的鏈接發佈問題後),但不能得到它在Windows編譯;我正在使用mingw g ++。我已將所有包含路徑更改爲windows路徑,並且jni.h位於編譯時,但不是jvm.dll。未定義的引用'JNI_CreateJavaVM'窗口
undefined reference to `JNI_CreateJavaVM' linux
這裏是我試過的命令使用編譯:
g++ -g -I"C:\Program Files (x86)\Java\jdk1.7.0_21\include" -I"C:\Program Files (x86)\Java\jdk1.7.0_21\include\win32" -L"C:\Program Files (x86)\Java\jdk1.7.0_21\jre\bin\server" callJava.cpp -ljvm
和...
**same as above with the additional** : -L"C:\Program Files (x86)\Java\jdk1.7.0_21\lib"
我得到的錯誤是:
undefined reference to `[email protected]'
和正在編譯的cpp:
#include <jni.h>
int main(){
//firstTest();
JavaVM *jvm;
JNIEnv *env;
JavaVMInitArgs vm_args;
JavaVMOption options[1];
options[0].optionString = "-Djava.class.path=C:/Users/Ron/Dropbox/jni/simple/ctojava/win";
vm_args.version = JNI_VERSION_1_6;
vm_args.options = options;
vm_args.nOptions = 1;
vm_args.ignoreUnrecognized = JNI_FALSE;
int res = JNI_CreateJavaVM(&jvm, (void **)&env, &vm_args);
jclass cls = env->FindClass("Hello");
jmethodID mid = env->GetStaticMethodID(cls, "staticInt", "(I)I");
env->CallStaticVoidMethod(cls, mid,10);
jvm->DestroyJavaVM();
}
我看了很多例子,但仍找不到解決方案。任何幫助表示讚賞!
更新:我敢肯定的是的jvm.dll位於因爲如果我刪除了-L「path_to_jvm」然後我得到的錯誤:
mingw32/bin/ld.exe: cannot find -ljvm
就像我說的,這個確切的方法在Linux中工作,還有什麼我缺少的Windows?
鏈接到使用g ++創建的MSVC庫可能會有問題。看到這個互操作性的帖子:http://www.mingw.org/wiki/MixingCompilers。你有沒有考慮過使用Visual Studio呢? – maba
@ maba-我已經嘗試在視覺工作室,但我得到了同樣的結果。你知道jvm.dll是用MSVC構建的嗎?我猜這不是,但這只是一個猜測。 – RBI
@RBI它是用MSVC構建的。函數名稱在輸出表中被破壞的方式是免費的。 – greatwolf