位置: 编程技术 - 正文

Android使用JNI(从java调用本地函数)(Android使用的方式来管理)

编辑:rootadmin

推荐整理分享Android使用JNI(从java调用本地函数)(Android使用的方式来管理),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:Android使用领域是什么,Android使用活动需要去什么进行注册,Android使用领域,Android使用领域,Android使用领域(移动端,PC,服务端),Android使用手册 - Live2DViewerEX文档,Android使用领域(移动端,PC,服务端),Android使用教程,内容如对您有帮助,希望把文章链接给更多的朋友!

当编写一个混合有本地C代码和Java的应用程序时,需要使用Java本地接口(JNI)作为连接桥梁。JNI作为一个软件层和API,允许使用本地代码调用Java对象的方法,同时也允许在Java方法中调用本地函数。

在Java端,开发者所需要做的仅仅是在连接本地函数的方法之前加上native关键字。这样VM就会去寻找这个本地函数。

1.从Java调用本地函数

从Java调用本地函数时,需要在类中定义一个带有native关键字的特有方法,作为连接本地代码的桥梁。通过这个定义,尝试调用本地方法时JVM会找到一个名字带有包名,类名和方法名的本地函数。

上面是一个简化的示例,包括一个对int数组进行排序的方法。除构造函数之外还有两个方法。第一个是sortIntegers(),它是一个常规的Java方法,可以在其他Java类中调用它。第二个是nativeSort(),这个方法指向本地代码中的函数。虽然可以把本地方法定义为公共的,但更好的做法是把它们作为私有方法包装在一个Java方法中,以便进行一些错误处理。

可以从头开始写本地代码,但也可以借助javah工具来生成部分代码,该工具在Java SDK中。它会生成一个C语言头文件,包括本地方法对应的函数定义。首先要编译Java程序代码,然后在当前项目的src/main目录运行如下命令:

javah -classpath ../../build/intermediates/classes/debug/ -d jni/ com.example.liyuanjing.jniproject.NativeSorting

上面命令展示了如何为之前示例代码中的NativeSorting生成一个头文件。-classpath参数指定了编译好的类文件位置,注意不是DEX文件。-d参数指定了生成头文件的输出目录。运行完命令后,会在jni目录生成com_example_liyuanjing_jniproject_NativeSorting.h文件,它包含了本地函数的定义。

这段代码即为生成的头文件。正如第一行注释所说,不要修改这个文件。开发者所要做的就是把函数定义复制到实现该函数的.c文件中。

下面的代码展示了头文件com_example_liyuanjing_jniproject_NativeSorting.h中的JNI函数实现,本例没有在JNI_OnLoad函数做太多的操作,只是返回了代表当前JNI版本为1.6的常量,这是Dalvik VM支持的一个版本,下面是array.c代码:

这个示例中,函数GetIntArrayElements,GetArrayLength和ReleaseIntArrayElements都是特定的JNI代码。第一个函数得到一个本地数据指针,以便把数据传给普通的C函数;第二个函数返回数据的大小;第三个函数告诉JVM本地端的工作已经完成,需要把数组复制回原地。这些函数都是必须的,因为从Java到JNI传送复杂的数据类型时必须通过JNIEnv对象来完成。

注意:调用GetIntArrayElements返回一个jint指针,指向函数中jintArray里的数据,接下来就可以把jint指针作为普通int类型指针来使用。

2.Android实现JNI

要想Android能运行起来,必须到NDK目录android-ndk-rdsamplesnative-activityjni目录下拷贝Android.mk,到刚才放置com_example_liyuanjing_jniproject_NativeSorting.h和array.c同一目录下,当然还要更改Android.mk的几个&#;。

LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := sorting_jniLOCAL_SRC_FILES := array.cinclude $(BUILD_SHARED_LIBRARY)

$(call import-module,android/native_app_glue)

一.LOCAL_PATH := $(call my-dir)

一个Android.mk file首先必须定义好LOCAL_PATH变量。它用于在开发树中查找源文件。在这个例子中,宏函数’my-dir’, 由编译系统提供,用于返回当前路径(即包含Android.mk file文件的目录)。

Android使用JNI(从java调用本地函数)(Android使用的方式来管理)

二.include $(CLEAR_VARS)

CLEAR_VARS由编译系统提供,指定让GNU MAKEFILE为你清除许多LOCAL_XXX变量(例如 LOCAL_MODULE, LOCAL_SRC_FILES, LOCAL_STATIC_LIBRARIES, 等等...),

除LOCAL_PATH 。这是必要的,因为所有的编译控制文件都在同一个GNU MAKE执行环境中,所有的变量都是全局的。

三.LOCAL_MODULE := sorting_jni

LOCAL_MODULE变量必须定义,以标识你在Android.mk文件中描述的每个模块。名称必须是唯一的,而且不包含任何空&#;。注意编译系统会自动产生合适的前缀和后缀,换句话说,一个被命名为'sorting_jni'的共享库模块,将会生成'libsorting_jni'文件。

重要注意事项

如果你把库命名为‘libhelloworld’,编译系统将不会添加任何的lib前缀,也会生成libhelloworld.so,这是为了支持来源于Android平台的源代码的Android.mk文件,如果你确实需要这么做的话。

四.LOCAL_SRC_FILES := array.c

LOCAL_SRC_FILES变量必须包含将要编译打包进模块中的C或C&#;&#;源代码文件。注意,你不用在这里列出头文件和包含文件,因为编译系统将会自动为你找出依赖型的文件;仅仅列出直接传递给编译器的源代码文件就好。【注意,默认的C&#;&#;源码文件的扩展名是’.cpp’. 指定一个不同的扩展名也是可能的,只要定义LOCAL_DEFAULT_CPP_EXTENSION变量,不要忘记开始的小圆点(也就是定义为‘.cxx’,而不是‘cxx’)(当然这一步我们一般不会去改它)】

五.include $(BUILD_SHARED_LIBRARY)

BUILD_SHARED_LIBRARY是编译系统提供的变量,指向一个GNU Makefile脚本(应该就是在build/core目录下的shared_library.mk),负责收集自从上次调用'include $(CLEAR_VARS)'以来,定义在LOCAL_XXX变量中的所有信息,并且决定编译什么,如何正确地去做。并根据其规则生成静态库。同理对于静态库。

当配置完上面所说的一个C头文件,一个.c文件,一个Android.mk文件后,进入CMD到当前目录中。输入ndk-build命令:

[armeabi] Compile thumb : sorting_jni <= array.c[armeabi] SharedLibrary : libsorting_jni.so[armeabi] Install : libsorting_jni.so => libs/armeabi/libsorting_jni.so

如果没有意外会显示上述正确结果。

然后在Android Studio项目的app/src/main/目录下建立jinLibs目录将生成的libs目录中的文件拷贝到JinLibs目录中。如下图所示:

然后调用此方法,就可以实现Android使用JNI的功能了。

- ::. -/com.example.liyuanjing.jniproject I/liyuanjinglyj﹕ - ::. -/com.example.liyuanjing.jniproject I/liyuanjinglyj﹕ - ::. -/com.example.liyuanjing.jniproject I/liyuanjinglyj﹕ - ::. -/com.example.liyuanjing.jniproject I/liyuanjinglyj﹕ - ::. -/com.example.liyuanjing.jniproject I/liyuanjinglyj﹕ - ::. -/com.example.liyuanjing.jniproject I/liyuanjinglyj﹕ - ::. -/com.example.liyuanjing.jniproject I/liyuanjinglyj﹕ - ::. -/com.example.liyuanjing.jniproject I/liyuanjinglyj﹕ - ::. -/com.example.liyuanjing.jniproject I/liyuanjinglyj﹕ 1

之前的JNI例子只是演示用的,开发者应该使用Arrays.sort()或Collections.sort()来进行排序。通常不需要在本地进行排序,因为Java实现已经够快了。

Android - DrawerLayout的使用 AndroidDrawerLayout的使用。从屏幕的左右边缘开始拖动,能拖出一个新的视图。activity_main.xmlandroid.support.v4.widget.DrawerLayoutxmlns:android=

Android开发:StaggeredGridView瀑布流控件运行异常崩溃解决方法 StaggeredGridView是github上一个开源的瀑布流图片库,本文将分享集成StaggeredGridView时碰到的异常以及解决方法,StaggeredGriedView开源地址为:

android(8) ViewPager页面滑动切换 一.ViewPager页面滑动切换实现:借鉴了别人的源码,还是比较容易实现的,而且这种效果还是经常使用的,特此记录一下:效果图:主界面:publicclassMainA

标签: Android使用的方式来管理

本文链接地址:https://www.jiuchutong.com/biancheng/383269.html 转载请保留说明!

上一篇:Android自定义属性时TypedArray的使用方法(android 自定义dialog)

下一篇:Android - DrawerLayout的使用

  • 买房子一定要交税吗
  • 商业折扣影响主要因素有
  • 已出库未开票要交税吗
  • 股权转让与增资扩股的税务
  • 加工费的计提工资账务处理
  • 土地增值税清算全流程实战案例
  • 计提递延所得税资产
  • 预付账款转入其他非流动资产
  • 借款合同法律规定的表述
  • 公司办公室收到上级主管部门的一份
  • 认缴制下收到股东转入的钱怎么入账
  • 销售产生的增值税
  • 支付宝手续费由谁承担
  • 哪些员工福利可以让企业合理避税
  • 食用油从商业流入的原因
  • 小微企业季度超过45万如何填申报表
  • 污泥处置中心所得税优惠政策
  • 继承的房产出售要交20%是全额还是差额
  • 财务负责人必须是本公司员工吗
  • 进口应付款融资
  • 什么叫净资产收益率
  • 增值税专用发票抵扣期限
  • 长期待摊费用多少钱
  • 2019年基金市场
  • 房租费进项税能不能抵扣
  • 个税缴纳期数填1是什么意思
  • 税务师如何办理入会
  • hdmi连接电视无法全屏
  • 冲减以前年度营业外收入
  • 什么情况下可以认定为工伤
  • 所得税汇算清缴前取得跨年发票
  • 营改增之前没有增值税吗
  • php bcmul
  • 工程施工暂估的成本的依据
  • rteng7.exe - rteng7是什么进程 有什么用
  • 交通费补贴算工资吗?
  • php import
  • Javan tree frogs sitting together on a stalk in Indonesia (© SnapRapid/Offset by Shutterstock)
  • vue聊天系统
  • 一个简单安全的小故事
  • 三栏式明细账需要每笔结余额吗
  • 经营活动现金流为正说明什么
  • 厂房建设包括哪些
  • mongodb使用场景总结
  • SQL中print、sp_helptext的限制与扩展
  • 小企业如何计提折旧
  • 企业期末预收账款怎么算
  • 六税两费减半征收政策2023
  • 金税四期介绍 王石
  • 土地使用权转让法律规定
  • 个人社保应不应该缴纳
  • 房地产开发的土地分割
  • 流动资金周转次数计算公式
  • 计提印花税会计科目
  • 贷款保险费由谁承担
  • 公司购入的房子卖了,如何交增值税
  • 股东预分配利润后如何返还
  • 手续费和利息费用的区别
  • 公益募捐的基金是什么
  • centos虚拟机怎么用
  • mac怎么隐藏桌面文件
  • wp升级
  • 如何隐藏与显示元素
  • WinXP下载东西总提示找不到文件的原因及解决方法
  • win10通知中心
  • centos8安装锐速
  • win10右下角功能列表不见了
  • 个人pc用户免费下载软件
  • 电脑安装win8
  • android.system.suspend@1.0-service耗电
  • jsonp的使用
  • javascript 数组
  • android 图片滚动
  • js判断div是否存在
  • 使用jQuery加载html页面到指定的div实现方法
  • 公司信用等级b级是什么意思
  • 已经交完费还可以用医保卡报销吗
  • 税务申报作废后无法申报
  • 怎么查询地税信息表
  • 个人所得税的工资比实际的多
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设