Вызов функции указатель из JNI - PullRequest
3 голосов
/ 08 июля 2011

У меня уже есть функция, реализованная в cpp с прототипом

MyFunction (int size, int (* callback) (UINT16 * arg1, UINT16 * arg2));

Второй аргумент - это указатель на функцию, которая должна быть реализована в Java. Как я могу реализовать эту функцию? Также как я могу позвонить MyFunction в JNI? Пожалуйста, помогите

Ответы [ 2 ]

3 голосов
/ 08 июля 2011

Попробуйте это

  • Java

    import java.util.*;
    
    public class JNIExample{
    static{
      try{ 
            System.loadLibrary("jnicpplib");
      }catch(Exception e){
         System.out.println(e.toString());
      }
    }
    
    public native void SetCallback(JNIExample jniexample);
    
    public static void main(String args[]){
         (new JNIExample()).go();
    }
    
    public void go(){
        SetCallback(this);
    }
    
     //This will be called from inside the native method    
     public String Callback(String msg){
        return "Java Callback echo:" +msg;
     } 
    }  
    
  • В C ++ native:

    #include "JNIExample.h"
    
    JNIEXPORT void JNICALL Java_JNIExample_SetCallback (JNIEnv * jnienv, jobject jobj, jobject      classref)
    {
       jclass jc = jnienv->GetObjectClass(classref);
       jmethodID mid = jnienv->GetMethodID(jc, "Callback","(Ljava/lang/String;)Ljava/lang/String;");
       jstring result = (jstring)jnienv->CallObjectMethod(classref, mid, jnienv->NewStringUTF("hello jni"));
       const char * nativeresult = jnienv->GetStringUTFChars(result, 0); 
    
       printf("Echo from Setcallback: %s", nativeresult);
    
       jnienv->ReleaseStringUTFChars(result, nativeresult); 
    }
    
  • Идея здесь заключается в вызове метода в Java через его экземпляр класса.Если вы заранее не знаете имя java-функции, тогда имя функции также можно передать в качестве параметра.

Для получения дополнительной информации: http://www.tidytutorials.com/2009/07/java-native-interface-jni-example-using.html

1 голос
/ 23 мая 2012

В своем собственном коде C ++ вы можете просто определить реализацию функции обратного вызова Java для вызова функции и затем передать указатель функции в вашу собственную библиотеку - например, так:

native c++:
// link func
callback_link(int size, int (* callback)(UINT16* arg1, UINT16* arg2)){
  //jni->call Java implementation
}

// call your lib    
MyFunction(int size, int (* callback_link)(UINT16* arg1, UINT16* arg2));
...