如何从jni端调用java方法?

 2023-01-19    405  

问题描述

我在JNI方面执行了一些C代码功能,所有工作正常.

public native String getMessage()

函数将字符串从JNI侧返回到Java侧,并且效果很好,所有其他JNI代码也可以正常工作.但是问题是我如何在不使用返回的情况下返回JNI函数中的字符串,因此

如何从jni端调用java方法?

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侧都可以正常工作,因为它不是启动Worker线程,但是现在只是在每个迭代时间中获取字符串而不使用函数返回的问题.

推荐答案

我的建议:

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

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

现在,您必须调用处理程序的on Returnedstring,因此您必须使用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 */
 }

然后,当您需要调用函数时:(我想结果是JSTRING)

(*env)->CallVoidMethod(env, handler, mid, resultString);

我尚未测试代码,但您有基本想法.

一些参考和示例代码在这里

以上所述是小编给大家介绍的如何从jni端调用java方法?,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!

原文链接:https://77isp.com/post/25860.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。