从JNI调用函数指针

我已经在cpp中使用原型实现了一个函数

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

第二个参数是一个必须在java中实现的函数指针。 我该如何实现该function? 另外我如何在JNI中调用MyFunction? 请帮忙

试试这个

  • 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 ++本机中:

     #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

在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));