JNI Callback Funktion

Nud3l

Gesperrter Benutzer
Hi,

ich bin gerade dabei mich mit JNI zu beschäftigen. Aber irgendwie will mein Code nicht gehen habe ein Beispiel aber das klaptt nicht wäre schön wenn jemand ein tip hat was ich falsch mache.

Ich möchte aus C einfach eine java Methode aufrufen..

Dazu habe ich in C folgendes geschrieben
Code:
JNIEXPORT jint JNICALL Java_jni_test_JniInterface_jniDisconnect (JNIEnv *env, jobject ob) {

    printf("JNI c Part\n");
	
   jclass icls = env->GetObjectClass(ob);

   /* Adresse der Methode "callback" des aufrufenden Java Objektes
      ermitteln: */
   jmethodID jmid = env->GetMethodID(icls, "blub", "(I)V");

   if (jmid == 0) {
      printf("jmid == NULL\n");
   }

   /* Methode "callback" des aufrufenden Java Objektes aufrufen: */
   env->CallVoidMethod(ob, jmid, 5);

   printf("Wieder zurück im native Code\n");
   return 1;
}

mein java Code:
Code:
package jni.test;

public class JniInterface {
        public static native int jniDisconnect();

	private void blub( int test){
		System.out.println("Java Callback blub");
	}

	public static void main(String[] args) {
		jniDisconnect();
       }}

Das Problem das ich habe ist das jmid immer 0 ist was wohl bedeutet das die Funktion nicht gefunden wird aber warum kann das was mit den Package zutun haben? muss ich die noch irgendwo angeben
 
Findet er denn die Klasse, also ist "icls =! NULL"? Falls nicht, vielleicht mal versuchen, die Klasse direkt mit env->FindClass zu finden
 
Also wenn ich
Code:
icls = env->FindClass("jni/test/JniInterface");
Aufrufe ist jmid != 0

Aber ich bekomme beim Aufruf von
Code:
env->CallVoidMethod(ob, jmid, 5);
Probleme.

Kann das Problem daran liegen das
Code:
ob
nicht richtig gesetzt wird?

Edit: ich nutze MinGW zum erstellen der dll kann es etwas damit zutun haben?
 
Zuletzt bearbeitet:
Hi, ich habe jetzt den Fehler selber gefunden.

wie ich vermutet habe wurde das jobject nicht richtig erstellt. Grund dafür war der auf ruf der static jniDisconnect();

Java:
public class JniInterface {
    public native int jniDisconnect();

	private void blub( int test){
		System.out.println("Java Callback blub");
	}

	public static void main(String[] args) {
        JniInterface jni = new JniInterface();
		jni.jniDisconnect();
}}

jetzt funktioniert auch der Aufruf via
Code:
jclass icls = env->GetObjectClass(ob);
 
Static ist an sich kein Problem.... Da steht unter JNI Functions auch einiges dazu (zugegeben: Mit hätte eigentlich auffallen sollen, dass es nicht [c]JNIEnv *env, jobject ob[/c] sondern [c]JNIEnv *env, jclass cls[/c] hätte sein sollen...)
 
Also es hat auf Jedenfall auch etwas mit static zu tun bzw. mit den Aufruf der jni Funktion. Habe es gerade noch mal mit jclass probiert und static und es lief nicht..
 
Hua, ja, bin noch nicht ganz wach... es ging darum, dass die native-Methode static war, aber die, die aufgerufen werden sollte war es nicht. Wenn beide static sind (oder beide nicht static) funktioniert es.
 

Zurück
Oben