Hallo zusammen.
Mein Bestreben ist es, JAVA Methoden von C++ Code aufzurufen. Dafür dient ja JNI (auch wenn's vorrangig anders rum genutzt wird) und habe mir auch ein Testprojekt erstellt.
Folgendes Problem:
Ich kann nur erfolgreich die main(..) aufrufen. Die testoring(), method1() findet er nicht. Was mache ich falsch??
(Nicht über den Code stören, ist nur ne Spielewiese
)
JAVA COde:
C++ Code:
Kann mir jemand weiterhelfen, bzw. mir en Tipp geben, wo es gute Info's zu "JAVA Methoden von C++ Code aufrufen" gibt?
Vielen Dank
Mein Bestreben ist es, JAVA Methoden von C++ Code aufzurufen. Dafür dient ja JNI (auch wenn's vorrangig anders rum genutzt wird) und habe mir auch ein Testprojekt erstellt.
Folgendes Problem:
Ich kann nur erfolgreich die main(..) aufrufen. Die testoring(), method1() findet er nicht. Was mache ich falsch??
(Nicht über den Code stören, ist nur ne Spielewiese
JAVA COde:
Code:
class Testor
{
public static void method1(int a)
{
a = 0;
System.out.println("JAVA Class: void method1(int a) {..}");
}
public static void main(String[] args)
{
System.out.println("JAVA Class: void main(String[] args) {..}");
System.out.println("calling testoring()...");
testoring();
method1(0);
}
public static void testoring()
{
System.out.println("JAVA Class: void testoring() {..}");
}
}
C++ Code:
Code:
#include <iostream>
using namespace std;
/*
* Benötigt für Java Native Interface:
*/
#include <jni.h>
/*
* ENDE *
*/
int main()
{
cout << "JNI- Testor:" << endl;
// benötigte Variablen:
JavaVM * jvm;
JNIEnv * env;
JavaVMOption options[1];
JavaVMInitArgs vm_args;
// Version festlegen:
vm_args.version = JNI_VERSION_1_6;
// default Argumente holen:
JNI_GetDefaultJavaVMInitArgs(&vm_args);
// Pfad zur Java- Klasse festlegen:
options[0].optionString = "-Djava.class.path=C:\\CHT\\Test- Projects\\JNI_Test";
vm_args.nOptions = 1;
vm_args.options = options;
// zur Fehlererkennung:
jint value;
// JavaVM erzeugen:
value = JNI_CreateJavaVM(&jvm, (void **)&env, &vm_args);
if(value < 0)
{
cout << value << " : ";
switch(value)
{
case JNI_ERR:
cout << "JNI_ERR" << endl;
break;
case JNI_EDETACHED:
cout << "JNI_EDETACHED" << endl;
break;
case JNI_EVERSION:
cout << "JNI_EVERSION" << endl;
break;
case JNI_ENOMEM:
cout << "JNI_ENOMEM" << endl;
break;
case JNI_EEXIST:
cout << "JNI_EEXIST" << endl;
break;
case JNI_EINVAL:
cout << "JNI_EINVAL" << endl;
break;
}
return -1;
}
else
cout << "CreateJavaVM success!!" << endl;
// jclass zeigt auf die gewünschte JAVA Klasse:
jclass javaClass;
if (javaClass = env->FindClass("Testor"))
cout << "FindClass success!!" << endl;
else
cout << "FindClass failed :(" << endl;
//jmethodID zeigt auf die gewünschte JAVA Methode:
jmethodID testoring;
if(testoring = env->GetStaticMethodID(javaClass, "main", "([Ljava/lang/String;)V"))
{
cout << "GetStaticMethodID success!!" << endl
<< "now call CallStaticVoidMethod(..)" << endl;
for(int i=0; i<100; i++)
// mit jclass und passender jmethodID wird hier die Funktion ausgeführt:
env->CallStaticVoidMethod(javaClass, testoring, 0);
}
else
cout << "GetStaticMethodID failed :(" << endl;
cout << "JavaVM has finished. Now it's time to destroy it!" << endl;
// zum Schluss wird die VM zerstört:
jvm->DestroyJavaVM();
return 0;
}
Kann mir jemand weiterhelfen, bzw. mir en Tipp geben, wo es gute Info's zu "JAVA Methoden von C++ Code aufrufen" gibt?
Vielen Dank