在jni中使用回调有以下两种思路:
第一种,在java中写一个回调方法,然后在jni中调用这个方法。代码示例:
...
public void onNativeCallback(int code, String result) {
...
}
...
// 2. 获取对应的Class对象
jclass jclazz = env->GetObjectClass(env, obj_local);
if (jclazz) {
// 3. 获取定义的Java层回调函数的MethodId
jmethodID jmethodid = env->GetMethodID(env, jclazz,"onNativeCallback","
(ILjava/lang/String;)V");
if (jmethodid) {
// 4. 调用Java层回调函数
env->CallVoidMethod(env, obj_local, jmethodid, 0, type);
}
}
...
第二种,在调用底层方法时把回调对象作为参数传进去,然后调用该回调对象中的方法。代码示例:
...
public native void call(String message, MyListener listener);
...
...
jclass jclazz = env->GetObjectClass(env, listener);
if (jclazz) {
jmethodID jmethodid = env->GetMethodID(env, jclazz,"onNativeCallback","
(ILjava/lang/String;)V");
if (jmethodid) {
env->CallVoidMethod(env, listener, jmethodid, 0, answer);
}
}
...
如果你还有更好的方法,欢迎讨论!