[安卓开发笔记二]android Studio通过jni调用C++代码
16/12/11 更新 此博客基于安卓android studio 1.5所写,现在已经有了android studio2.2的版本,2.2编写jni更加的方便,编译so使用cmakelists超爽,并且可以在c代码层断点调试,建议大家看完这个对安卓上jni有所了解后(2.2兼容此方法的jni编写,并且有了新的更强大的jni开发功能),去研究下2.2下jni编写哈,本人工作比较忙,闲下来会补上基于2.2版本的jni开发
自己需要用到android studio开发安卓项目,为了效率需要用jni来调用C++底层代码,网上关于这方面的资源十分匮乏,自己踩了很多坑,总算明白android studio是如何进行jni的调用,记录与此,贡献自己的一点力量,让后来人少踩坑
1、开发ide:
操作系统win7或者mac均可,这点没有关系哈
android studio(开发jni层代码,真机调试)
VS+大番茄插件(编写C++底层代码,这一步也可以直接在AS中完成,不过VS中调试C++代码会方便一点)
2、前期准备
安装android studio(一下简称AS),包括sdk和ndk的安装,注意安装过程中需要连google,可以改hosts或者翻墙,其中sdk在AS安装过程中会自动下载安装,主要用作安卓程序的编译工作。
NDK的安装:安装好AS后打开随便建一个空project,然互file—-other setting—–default project structure
最下面那行,没有的话按照上面的提示点击进去就会自动下载安装,NDK用作和调用C++代码等底层的工作。
安装完ndk要在projetc主目录下的gradle.properties最后加上
android.useDeprecatedNdk = true
附上google hosts地址:
googlehosts
安装VS和大番茄插件,这个我就不用详细说了。(自己直接在AS中编写C++代码就不需要进行VS的安装)
3、创建一个调用C++的Demo
打开AS创建一个新project
添加一个java类,专门声明jni的java接口函数
使用javah生成jni层头文件
在AS底部就有“Terminal”入口,然后进入如上图所示的目录
你的目录可能和我的不一样,简单地说,就是进入project下的java目录下,然后运行
javah -d ../jni com.example.xiaosheng.baoman1.TryJni
其中-d ../jni是指定生成的文件存放路径
com.example.xiaosheng.baoman1.TryJni是包括路径名的class类名,就是原本是这个:
com/example/xiaosheng/baoman1/TryJni.java
去掉后缀“.java”然后将‘/’替换成‘.’回车运行即可
就会生成对应的头文件
8月2号更新
8月2日更新
很多同学反应按照上述流程生成.h文件会提示找不到类文件,我也不清楚为嘛,在我的电脑win7或者mac上都是可以的,既然简单的方法不行,只好用稍微复杂一点的方法来生成了。
首先build以下整个项目(先build才会生成class文件),然后找到对应的class目录
然后在Terminal下进入到上图中的debug目录(进入此目录是为了方便classpath的指定,不然在外面指定很绕),然后执行
Javah –classpath ./ -d ../jni –jni com.XXX.XXX.jniTest
-classpath后面跟class所在的根目录,我们已经在这个目录所以class后面跟的是当前目录 ./
“-d ../jni”表示输出目录是上一层的jni目录下
“-jni”后面跟完整的包名+类名中间用“.”来连接
好了。
自己创建一个和.h文件同名的.cpp文件,将.h的内容复制大.cpp中有一点要注意在.h中生成的函数声明中只有参数类型,但是没有参数名称,在.cpp参数配上参数名
这里我演示一个调用第三方C++文件的函数的实现,所以我这里会写一个简单地C++代码,直接在AS中写,函数作用就是把一个float数组里的数字变成原来的两倍。
在jni层的cpp文件中实现数据类型的转换,调用C++完成功能,并向java层返回值
头文件别忘了包含
写好后在app文件夹下的build.gradle中编写ndk编译信息,ndk中的模块名要和你在jniTest中load的模块名保持一致
在主函数中写上测试程序
运行,
大功告成
生成的so,在这里
ps:android studio 中已经不用编辑android.mk和application.mk了,只用编辑grade即可,比eclipse方便很多!耶!
有问题可留言或者联系我邮箱291298162@
如果觉得《[安卓开发笔记二]android Studio通过jni调用C++代码》对你有帮助,请点赞、收藏,并留下你的观点哦!