失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > [安卓开发笔记二]android Studio通过jni调用C++代码

[安卓开发笔记二]android Studio通过jni调用C++代码

时间:2020-12-24 04:29:31

相关推荐

[安卓开发笔记二]android Studio通过jni调用C++代码

[安卓开发笔记二]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++代码》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。