[英]How would you call a Java method that takes a lambda as an argument from the native side of JNI?
[英]How to call java method from jni side?
我在 jni 端做了一些 c 代码函数,一切正常。
public native String getMessage()
函数正在将字符串从 jni 端返回到 java 端,它工作正常,所有其他 jni 代码也工作正常。 但问题是如何在不使用 return 的情况下在 jni 函数中返回字符串,所以
public native void getMessagewithoutReturn()
应该能够返回字符串。 然后我但是 getMessagewithoutReturn() 函数使用 pthread 永远不会结束循环,如下所示:(它有效)
pthread_t native_thread;
pthread_create(&native_thread, NULL, native_thread_start_reading, env);
并且每个循环迭代时间我都必须能够返回字符串,所以我不能使用返回,因为它会停止函数运行。
pthread_t native_thread;
pthread_create(&native_thread, NULL, native_thread_start_reading, env);sted out that
我已经测试了 posix 线程并且在 android 端一切正常,因为它没有启动工作线程,但现在只是在每次迭代时获取字符串的问题,而不使用函数返回。
我的建议 :
创建一个将接收字符串的类(您也可以使用接口或抽象类):
class ResultHandler {
public void onReturnedString(String str)
{
/* Do something with the string */
}
}
然后更改函数的原型:
public native void getMessagewithoutReturn(ResultHandler handler);
并且本机功能将变为:
void Java_com_foo_bar_getMessagewithoutReturn(JNIEnv *env, jobject thiz, jobject handler);
现在您必须调用处理程序的 onReturnedString,因此您必须使用 JNI 函数:
jmethodID mid;
jclass handlerClass = (*env)->FindClass(env, "com/foo/bar/ResultHandler");
if (handlerClass == NULL) {
/* error handling */
}
mid = (*env)->GetMethodID(env, handlerClass, "onReturnedString", "(Ljava/lang/String;)V");
if (mid == NULL) {
/* error handling */
}
然后当你需要调用函数时:(我想 resultString 是一个 jstring)
(*env)->CallVoidMethod(env, handler, mid, resultString);
我还没有测试代码,但你有基本的想法。
一些参考和示例代码在这里
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.