java - 如何从 jni 端调用 java 方法?

标签 java java-native-interface pthreads android-ndk

我在 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);

并且每个循环迭代时间我都必须能够返回字符串,所以我不能使用 return,因为它会停止函数运行。

pthread_t native_thread;
pthread_create(&native_thread, NULL, native_thread_start_reading, env);sted out that 

我已经测试了那个 posix 线程并且在 android 端一切正常,因为它一直没有启动工作线程,但现在只是在每个迭代时间获取字符串的问题,而不使用函数返回。

最佳答案

我的建议:

创建一个接收字符串的类(您也可以使用接口(interface)或抽象类):

class ResultHandler { 
    public void onReturnedString(String str) 
    { 
        /* Do something with the string */ 
    } 
}

然后更改函数的原型(prototype):

public native void getMessagewithoutReturn(ResultHandler handler);

并且 native 函数将变为:

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);

我没有测试代码,但你有基本的想法。

一些引用和示例代码 here

关于java - 如何从 jni 端调用 java 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6055229/

相关文章:

java - 在 SpringMVC 中,我在 Centos 7 STS 中部署和运行另一个系统的项目,它给出了错误

java - "..."在 Java 中被使用?

java - 我可以在 Java Applet 中使用 JNI 吗?

c++ - 当线程数增加时,多线程文件 IO 程序的行为不可预测

c - pthread_join 中的悬垂指针?

java - Jpype导入在jar中找不到模块

java - Android 重定向(返回代码 302)处理

Linux,取消阻塞read()

java - JNI 崩溃 JVM - Java 运行时环境 : EXCEPTION_ACCESS_VIOLATION 检测到 fatal error

c - 从文件中读取异步 I/O