java - 使用接口(interface)在 JNI 中实现回调函数

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

我需要使用“接口(interface)”在 Java 中实现回调函数。我将应用程序部分编写为 MyJavaFunction(int size, m_GetSizeInterface);

m_GetSizeInterface 是一个包含回调函数GetSize 的接口(interface)。此 GetSize 方法在应用程序中被覆盖。在 JNI 中,我需要调用具有原型(prototype) int MyCPPFunction(int size, int (*callback)(int* ID));

的 CPP 函数

如何将此 GetSize 作为参数传递给 JNI 中的 MyCPPFunction?请帮忙

public int GetSize (m_SizeClass arg0)
{
    g_size = arg0.size;
        return 0;
}

最佳答案

这里的复杂之处在于您想要调用 native C++ 代码,而您又想要调用 Java 方法。这实际上有点棘手。

需要创建一个JNI C++函数供java调用,以及一个C++函数匹配 MyCPPFunction 回调签名。后者将充当调用 java 方法的包装器。

因为包装器需要有关 JNI 环境的信息,这些信息不能由参数提供(以免我们破坏签名),所以您创建了一些全局变量来保存它:

jobject g_getSizeIface;
jmethodID g_method;
JNIEnv *g_env;

java调用的C++函数如下:

JNIEXPORT void JNICALL Java_ClassName_MyCPPFunction
     (JNIEnv *env, jint size, jobject getSizeInterface)
{
      jclass objclass = env->GetObjectClass(getSizeInterface);
      jmethodID method = env->GetMethodID(objclass, "GetSize", "(m_SizeClass)I");
      if(methodID == 0){
          std::cout << "could not get method id!" << std::endl;
          return;
      }
      g_method = method;
      g_getSizeIface = getSizeInterface;
      g_env = env
      MyCPPFunction(size, WrapperFunc);
}

因此包装函数是:

int WrapperFunc(int *id)
{
      jint retval;
      //marshalling an int* to a m_SizeClass boogy-woogy.
      ...
      g_env->ExceptionClear();
      retval = g_env->CallIntMethod(g_getSizeIface, g_method, 
                                    /*marshalled m_SizeClass*/);
      if(g_env->ExceptionOccurred()){
          //panic! Light fires! The British are coming!!!
          ...
          g_env->ExceptionClear();
      }     
      return rvalue;
}

关于java - 使用接口(interface)在 JNI 中实现回调函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6746078/

相关文章:

java - 如何像参数一样使用 URL

java - Android,无法使静态 getter setter 属性起作用吗?

java - 如何使用 lambda 在 Java 中实现两个抽象方法?

java - java中抽象类和接口(interface)的具体使用

javascript - Meteor/Node.js : Multiple http requests within a for loop, 在时间间隔内均匀分布?

c++ - 跟踪 Lua 中的变量以读取访问权限以启动用户定义的 C++ 方法/函数

javascript - 使用回调 Javascript 在多个函数中获取多个数据

java - 公共(public)类的私有(private)内部类的可见性

java - 无法实例化内部类

java接口(interface)方法输入本身