Bonjour à tous, depuis bientôt deux jours j'essaie d'implémenter ma première JVM en C++ afin d'exécuter ma méthode exposée dans ma classe java eh bien mais ça va pas.
ci-dessous mes classes et tous les fichiers et arborescences:
fichier.java
Code Java : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 package fc.Application.JVMHost.Java; public class TestJava { public static void hello(String name) { System.out.println("Hello Word (from Java) " + name); } public static void main(String[] args) { } }
Code CMakeLists : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 cmake_minimum_required (VERSION 3.1) project (tpInterop) set(CMAKE_CXX_STANDARD 11) find_package(JNI REQUIRED) INCLUDE_DIRECTORIES(${JNI_INCLUDE_DIRS}) add_executable(tpInterop main.cpp) target_link_libraries(tpInterop ${JNI_LIBRARIES})
fichier cpp
Pour les arborescences comme indiqué dans mon code cpp, j'ai mon programme Java dans un dossier du nom tpInteropCppJava_Java puis tout ce qui suit notamment le répertoire bin et les packages fc.Application..... jusqu'au fichier.class
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40 #include <jni.h> #include <iostream> #include <string.h> using namespace std; int main(int argc, char **argv) { std::cout << "Hello" << std::endl; char path[1000]="-Djava.class.path=../../tpInteropCppJava_Java/bin/fc.Application.JVMHost.Java/"; JavaVMOption jvmopt[1]; jvmopt[0].optionString = path; JavaVMInitArgs vmArgs; vmArgs.version = JNI_VERSION_1_2; vmArgs.nOptions = 1; vmArgs.options = jvmopt; vmArgs.ignoreUnrecognized = JNI_TRUE; JavaVMInitArgs vm_args; JNIEnv *jniEnv; JavaVM *javaVM; //JNIEnv * env; long indicateur = JNI_CreateJavaVM(&javaVM, (void**)&jniEnv, &vmArgs); if(indicateur == JNI_ERR){ cout << "Erreur lors de la création de la machine virtuelle. Sortie ... \n"; return 1; } jclass jcls = jniEnv->FindClass("fc/Application/JVMHost/Java/TestJava"); if (jcls == NULL) { if( jniEnv->ExceptionOccurred() ) jniEnv->ExceptionDescribe(); else cout << "clsMain is null but no exception was thrown." << endl; javaVM->DestroyJavaVM (); return 1; } javaVM-> DestroyJavaVM (); return 0; }
et quand j'indique à mon env->findClass("mes/package/maclass") il me donne une erreur
Et j'ai tout mis dans ma classe path peut-être sauf le bon et j'ai vivement besoin de vos aides afin que je puisse bouger de là depuis bientôt deux jours.Exception in thread "main" java.lang.NoClassDefFoundError: fc/Application/JVMHost/Java/TestJava Caused by: java.lang.ClassNotFoundException: fc.Application.JVMHost.Java.TestJava at java.net.URLClassLoader.findClass(URLClassLoader.java:382) at java.lang.ClassLoader.loadClass(ClassLoader.java:424) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349) at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
Je vous remercie d'avance.
Partager