Implémenter JVM en C++ avec JNI
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:
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:
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
Code:
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;
} |
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
et quand j'indique à mon env->findClass("mes/package/maclass") il me donne une erreur
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)
Et j'ai tout mis dans ma classe path peut-être sauf le bon :zoubi: et j'ai vivement besoin de vos aides afin que je puisse bouger de là depuis bientôt deux jours.
Je vous remercie d'avance.