Java 代码
package test; public class MyNativeClass { static { System.load(System.getProperty("user.dir") + "\\test_MyNativeClass.dll"); } private native int calculate(int a, int b, OperationCallback callback); // 模拟的指针函数 public int performCalculation(int a, int b) { OperationCallback callback = new OperationCallback() { @Override public int execute(int a, int b) { return a + b; } }; return calculate(a, b, callback); } private interface OperationCallback { int execute(int a, int b); } public static void main(String[] args) { MyNativeClass ojb = new MyNativeClass(); int result = ojb.performCalculation(1,2); System.out.println(result); } } |
C++ 代码实现
头文件 /* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class test_MyNativeClass */ #ifndef _Included_test_MyNativeClass #define _Included_test_MyNativeClass #ifdef __cplusplus extern "C" { #endif /* * Class: test_MyNativeClass * Method: calculate * Signature: (IILtest/MyNativeClass/OperationCallback;)I */ JNIEXPORT jint JNICALL Java_test_MyNativeClass_calculate (JNIEnv* env, jobject obj, jint a, jint b, jobject callbackObj) ; #ifdef __cplusplus } #endif #endif |
.cpp 文件实现
#include <jni.h> #include "test_MyNativeClass.h" JNIEXPORT jint JNICALL Java_test_MyNativeClass_calculate (JNIEnv* env, jobject obj, jint a, jint b, jobject callbackObj) { // 获取回调接口的类和方法ID jclass callbackClass = env->GetObjectClass(callbackObj); jmethodID executeMethod = env->GetMethodID(callbackClass, "execute", "(II)I"); // 调用回调方法获取结果 jint result = 0; if (executeMethod != NULL) { result = env->CallIntMethod(callbackObj, executeMethod, a, b); } return result; } |
输出结果