J’ai besoin d’appeler la méthode java du programme c. J’ai essayé ci-dessous de code pour appeler la méthode Java via une interface native Java, mais faire face à des problèmes pendant la compilation. Im nouveau à C et avoir de l’expérience en Java. donc, je ne suis pas capable de penser moi-même à ce qui se passe lors de la création de la machine virtuelle Java.
Ci-dessous le code.
CTest.c #include #include JNIEnv* create_vm() { JavaVM* jvm; JNIEnv* env; JavaVMInitArgs args; JavaVMOption options[1]; args.version = JNI_VERSION_1_6; args.nOptions = 1; options[0].optionSsortingng = "-Djava.class.path=D:\\Ashish_Review\\JNI\\src"; args.options = options; args.ignoreUnrecognized = JNI_FALSE; JNI_CreateJavaVM(&jvm, (void **)&env, &args); return env; } void invoke_class(JNIEnv* env) { jclass helloWorldClass; jmethodID mainMethod; jobjectArray applicationArgs; jssortingng applicationArg0; helloWorldClass = (*env)->FindClass(env, "HelloWorld"); mainMethod = (*env)->GetStaticMethodID(env, helloWorldClass, "main", "([Ljava/lang/Ssortingng;)V"); applicationArgs = (*env)->NewObjectArray(env, 1, (*env)->FindClass(env, "java/lang/Ssortingng"), NULL); applicationArg0 = (*env)->NewSsortingngUTF(env, "From-C-program"); (*env)->SetObjectArrayElement(env, applicationArgs, 0, applicationArg0); (*env)->CallStaticVoidMethod(env, helloWorldClass, mainMethod, applicationArgs); } int main(int argc, char **argv) { JNIEnv* env = create_vm(); invoke_class( env ); } C:\Users\Desktop\tcc>tcc C:\TurboC++\Disk\TurboC3\BIN\CTest.c -I "C:\Program Files\Java\jdk1.6.0_16\include" -I "C:\Program Files\Java\jdk1.6.0_16\include\win32" -shared -o CTest.dll tcc: undefined symbol '_JNI_CreateJavaVM@12'
Sil te plait aide moi.
Le message d’erreur concerne l’étape de la liaison, pas la compilation – vous avez inclus le fichier d’en-tête, mais pour créer le fichier exécutable, vous devez également spécifier le fichier .a (fichiers de bibliothèque).
Vous devez établir un lien avec la bibliothèque de la machine virtuelle (ajoutez une référence à libjvm.a à la ligne de commande du tcc).
Si vous n’avez pas de fichier jvm.lib précompilé pour TurboC ++, il existe une autre option: créer un lien avec le fichier jvm.dll et exporter manuellement toutes les méthodes à partir de la machine virtuelle Java. Ceci utilise les fonctions LoadLibrary / GetProcAddress.
Pour un court exemple (désolé, impossible de trouver le code source d’exportation complet), regardez ceci:
/* load library */ HMODULE dll = LoadLibraryA("jvm.dll"); /* declare a function pointer and initialize it with the "pointer" to dll's code */ JNI_CreateJavaVM_func JNI_CreateJavaVM_ptr = GetProcAddress(dll, "JNI_CreateJavaVM");
Plus tard, utilisez JNI_CreateJavaVM_ptr au lieu de JNI_CreateJavaVM. De plus, vous devrez déclarer le type JNI_CreateJavaVM_func
– vous pouvez simplement copier la signature de “jni.h”