我已经在cpp中使用原型
实现了一个函数MyFunction(int size,int(* callback)(UINT16 * arg1,UINT16 * arg2));
第二个参数是一个必须在java中实现的函数指针。我该如何实现该功能? 另外我如何在JNI中调用MyFunction?请帮忙
答案 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));