从JNI调用函数指针

时间:2011-07-08 04:27:54

标签: java java-native-interface function-pointers

我已经在cpp中使用原型

实现了一个函数

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

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

2 个答案:

答案 0 :(得分:3)

试试这个

  • 爪哇

    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 :(得分:1)

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