注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

Android开发之二十六JNI回调JAVA内部的函数  

2015-06-28 21:38:14|  分类: Android |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

Android开发之二十六JNI回调JAVA内部的函数

 

大家都知道在开发JAVA程序时有两种方法可以与NativeCC++通信,一种是使用JNI接口,一种是使用JNA库。这两种除了在效率上略有一些区别外,最主要的一个区别就是在JNI的情况下,可以直接在C/C++程序库里直接调用JAVA中的函数。但是JNA是不可以的。

那么到底使用哪种好呢?这个得看你的具体的应用情况,俗话说得好,最适用的就是最合理的,而不是盲目的使用哪种技术。

一般来说,推荐使得JNA,这样会使你的开发的进度大大加快,开发效率大大提高。何乐而不为呢?

这里在Eclipse里开发一个测试工程,老样子,仍然使用原来NDK的工程:

JNI工程在调用函数中增加下面代码:

    jclass cls = env->GetObjectClass(thiz);

    jstring str = env-> NewStringUTF("---OK,OK,OK");

 

    jmethodID cbFun =   env->GetMethodID(cls,"callback","(Ljava/lang/String;)V");

    env->CallVoidMethod(thiz, cbFun,str);

JAVA测试工程:

class TestNDKOption {

......

       public void callback(String str){

           Log.d("JNICB","this testndk callback");

           System.out.println(str);

       }

}

这里面的程序遇到了一个小坑,原来注意到过,但是现在又忘记了,那就是CC++在调用函数时的不同:

jni/hellocpp/main.cpp:16:18: error: base operand of '->' has non-pointer type 'JNIEnv {aka _JNIEnv}'

这个错误修改的方法是:

C的调用方式

jclass cls = (*env)->GetObjectClass(env,thiz)修改成下面的C++调用方式:

jclass cls = env->GetObjectClass(thiz)

第二个就是回传字符串时,要声明一个字符串变量,而不是直接使用(至少现在没找到直接使用的方法):

env->CallVoidMethod(thiz, cbFun,"OK,OK");这么调用是不可以的。

通过上面的方式,就可以看到,把本地库中的数据通过直接回调JAVA中的公有函数传回到了JAVA的函数里,这与直接传进去一个回调函数接口在C里面调用异曲同工,但看上去更好更方便。

每天进步一点点。

  评论这张
 
阅读(268)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017