繁体   English   中英

从 JNI 调用 function 指针

[英]Call function pointer from JNI

我有一个 function 已经用原型在 cpp 中实现

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

第二个参数是一个 function 指针,它必须在 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); }
  • 这里的想法是通过其 class 实例调用 Java 中的方法。 如果您事先不知道 java function 的名称,那么 function 名称也可以作为参数传递。

更多信息: http://www.tidytutorials.com/2009/07/java-native-interface-jni-example-using.html

In your C++ native code you can simply define a function call Java callback implementation and then pass the function pointer to your native library -- like this:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM