Sto cercando di acquisire familiarità con l'API JNI ma non riesco a ottenere un programma C++ di esempio da compilare. Ho ottenuto lo stesso esempio di compilazione ed esecuzione in linux (dopo aver postato la domanda nel link sottostante) ma non riesco a ottenerlo compilato in Windows; Sto usando mingw g ++. Ho cambiato tutti i percorsi di inclusione in percorsi Windows e jni.h si trova in fase di compilazione ma non in jvm.dll.riferimento non definito alle finestre `JNI_CreateJavaVM '
undefined reference to `JNI_CreateJavaVM' linux
Ecco i comandi che ho provato usando per compilare:
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
e ...
**same as above with the additional** : -L"C:\Program Files (x86)\Java\jdk1.7.0_21\lib"
L'errore che ottengo è:
undefined reference to `[email protected]'
e il cpp in fase di compilazione:
#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();
}
Ho esaminato molti esempi ma non riesco ancora a trovare una soluzione. Qualsiasi aiuto è apprezzato!
UPDATE: Sono abbastanza sicuro che la l'jvm.dll è situato perché se mi tolgo la -L "path_to_jvm" allora ottengo l'errore:
mingw32/bin/ld.exe: cannot find -ljvm
Come ho detto, questo approccio esatto funziona in Linux, che altro mi manca per Windows?
Può essere un problema collegare alle librerie create con MSVC da g ++. Vedi questo post di interoperabilità: http://www.mingw.org/wiki/MixingCompilers. Hai considerato di utilizzare Visual Studio invece? – maba
@ maba- Ho provato anche in Visual Studio, ma ottengo lo stesso risultato. Sai per certo che il file jvm.dll è stato creato con MSVC? Immagino che non lo sia, ma è solo una supposizione. – RBI
@RBI È costruito con MSVC. Il modo in cui i nomi delle funzioni sono stravolti nella tabella di esportazione è un regalo. – greatwolf