记录第一次使用jni编译so包的入门操作
1、配置
下载自己相对应的ndk平台版本后配置到studio

在local.properties加入路径

在gradle.properties文件添加

2、创建工具类(注意方法都是native的)

3、生成.h文件
打开terminal,cd到app/scr/main/java下,然后执行javah –jni <包名+类名>,此时.h文件就生成了。

注意:jdk10后移除了javah的相关功能,使用javac -h代替
比如上面的javah -jni com.example.jni.NativeKit替代为javac -h . com\example\jni\NativeKit.java
(记住不要忽略-h后的那个小点)
4、创建jni目录

5、 实现native方法
将.h文件拷贝到jni目录下,并创建相应的.cpp文件,实现.h文件定义的方法。(方法名不要改动)
比如,这里是.h生成的方法:

然后在c++文件中实现

PS:
如果出现error: base operand of '->' has non-pointer type '_JNIEnv' 或者
Error:(15, 1) A problem occurred evaluating project ':app'.
> Could not find method ndk() for arguments [build_aw0o6zph0cbkllbghhznstzhf$_run_closure1$_closure4@4202656a]
on project ':app' of type org.gradle.api.Project.的错误时,请检查你使用的文件后缀。
如果你使用.c的后缀,就必须用C语言来写:
return (*env)->NewStringUTF(env, "返回值");
如果是.cpp的后缀,那么就必须用c++来写:
return env->NewStringUTF((char *)"这是square的方法");
6、添加moduleName(so文件名)
修改build.gradle文件,添加moduleName,值即为生成的.so文件名。

这里注意一定要确定把ndk这段声明放在了defaultConfig里,不要问我为什么强调这个,心子痛...
7、运行app,AS将自动编译so文件

可在工程目录下 app\build\intermediates\ndk\debug\obj\local目录查看各平台的so文件。

参考:http://blog.csdn.net/huangximin1990/article/details/50441400
记录第一次使用jni编译so包的入门操作的更多相关文章
- 【转】Android 源码下利用jni编译自己的项目(参考系统development/samples/SimpleJNI)
原文网址:http://blog.csdn.net/qiuxiaolong007/article/details/7860481 记于正文前:环境是ubuntu10.10,android 源码是2.0 ...
- 韩顺平细说Servlet视频系列意外收获之用命令行编译带有包的java类解决方案
命令行编译带有包的java类 在命令行编译这一块,基本上都是新手入门时了解一下,然后就直奔IDE而去.这样固然没错,就怕那些--.然后今天在视频中看到了这种方法,觉得可能会用到,所以就记录下来了,以备 ...
- linux 中部署ant编译的包中缺少问题
今天遇到在window上部署ant编译的包,能运行正常,但部署在linux中出现跳不进jsp中,出现404问题,后来经过排查在jsp中<%@taglib prefix="c" ...
- jad 反编译 jar包
1.利用winrar解压缩jar包 或者CMD>jar -xvf test.jar -C classes 2.下载jad,利用jad反编译jar包 CMD>[jad_home]/jad.e ...
- jni编译non-numeric second argument to `wordlist' function错误
在jni编译过程中,遇到non-numeric second argument to `wordlist' function错误,个人遇到这个错误的原因,是因为从windows中拷贝了Android. ...
- MySQL免编译二进制包安装简记
相比较于MySQL的源代码安装来说.免编译二进制包的速度实在是快了太多,而且性能损失也不是很大,同时具有一定的定制性.所以,如果没有特殊的 需求,尽量用MySQL免编译二进制包来安装MySQL. 1. ...
- 编译APR包报错 rm: cannot remove `libtoolT': No such file or directory
centos 6 编译APR包报错 在当前apr 目录 : #Vi configure +31880 ,注释掉此行 再次编译即可.
- MatLab 2014a编译jar包时mcc无法使用的问题
http://blog.csdn.net/heroafei/article/details/43273373 MatLab 2014a编译jar包时mcc无法使用的问题 2015-01-29 16:5 ...
- Ubuntu 16.04 kinetic 编译指定包
编译指定包 catkin_make -DCATKIN_WHITELIST_PACKAGES=baoming 使用上述命令后catkin_make会一直编译上面那个包,想要编译全部包,使用 catkin ...
随机推荐
- Android: 设置 app 字体大小不跟随系统字体调整而变化
在做 app 内字体大小的需求,类似于 微信中设置字体大小. 那么就需要 app 不跟随系统字体大小调整而变化,找到了两个方法. 方法1: 重写 getResource() 方法,修改 configu ...
- 移动网络应用开发中,使用 HTTP 协议比起使用 socket 实现基于 TCP 的自定义协议有哪些优势?
HTTP 是应用层协议,TCP 是传输层协议(位于应用层之下),放在一起类比并不合适.不过猜测楼主是想对比 “标准 HTTP 协议” 还是 “自定义的协议(基于 TCP Socket)” . 一般来说 ...
- js获取IP地址方法总结
js代码获取IP地址的方法,如何在js中取得客户端的IP地址.原文地址:js获取IP地址的三种方法 http://www.jbxue.com/article/11338.html 1,js取得IP地址 ...
- 批处理向FTP上传指定属性的文件 批处理增量备份的例子
使用windows批处理向FTP上传具有指定属性的文件,类似增量备份功能. 对一个目录里的几个文件自动上传FTP时只上传有归档属性的文件,然后FTP上传成功后自动清除(本机)刚上传文件的归档属性. 类 ...
- 使用JS生成二维码QRCode
这其实很简单,项目中使用插件即可生成,主要有两种方式: 一种是在项目中使用java生成,把图片生成到某个目录,然后在用tomcat或者nginx虚拟一下路径即可访问,这种方式我们不用,因为会在目录中生 ...
- webBrowser获取cookie
private void BtnOpenUrl_Click(object sender, EventArgs e) { if (txtUrl.Text != "") { Myweb ...
- css3动画制作工具
1.从chrome webstore下载 chrome应用商店安装地址 2.直接下载crx文件 如果无法访问到chrome的应用商城,可以选择下载app.crx文件,在chrome中打开chrome: ...
- 10-free-must-read-books-machine-learning-data-science
Spring. Rejuvenation. Rebirth. Everything’s blooming. And, of course, people want free ebooks. With ...
- angular控制器的执行顺序和服务的注入情况
这篇文章到底要讲什么呢? 这必须要从栗子开始讲起... 看下面这两段代码: demo1: http://jsfiddle.net/ujzmvp3j/1/ demo2: http://jsfiddle. ...
- Python3玩转单链表——逆转单向链表pythonic版
[本文出自天外归云的博客园] 链表是由节点构成的,一个指针代表一个方向,如果一个构成链表的节点都只包含一个指针,那么这个链表就是单向链表. 单向链表中的节点不光有代表方向的指针变量,也有值变量.所以我 ...