记录第一次使用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 热修复】运行 Tinker 官方示例 ( 处理 TINKER_ID 问题 | 编译 debug 包 | 修改 Gradle 脚本 | 生成 patch 包 | 热修复 )
文章目录 一.下载官方示例源码 二.处理 TINKER_ID 问题 三.编译 debug 包 四.安装 APK 并运行 五.修改 Gradle 构建脚本中的文件名称 六.修改程序逻辑代码 七.生成 p ...
- 记录第一次使用linux部署springbootweb项目
记录第一次使用linux部署springbootweb项目 收获感受 经过一下午的安装虚拟机.Linux系统.JDK1.8,项目打包,解决bug,终于项目部署成功!哈哈哈哈哈哈哈哈哈 收获还是不错的, ...
- java jni编译_从源码编译Android系统的Java类库和JNI动态库的方法
利用源码编译Android系统Java类库 1.编写Java项目和Android.mk文件 ├── Android.mk └── src └── com └── lhw └── framework └ ...
- 记录第一次上线(阿里云为例 springboot+vue)
记录第一次上线的过程 因为是个小白,又因为疫情的原因,并且阿里大大很大气的送了一个服务器,正好临近毕业毕业设计快要完成,就想着能够上线试试看,然后学着配置服务器,买了一个域名!后面就讲接下来的遇见的很 ...
- Android聚合SDK母包反编译出包教程
文章目录 [前言] 一.SDK预处理 1.SDK资源合并 1.1.合并res目录下的资源 1.2.合并libs目录 1.3.合并assets目录 1.4.合并AndroidManifest.xml 1 ...
- Cmake + CMakeLists.txt 编译SO库(JNI编译)
cmake android-ndk google demo- https://github.com/googlesamples/android-ndk 在Android Studio中使用C/C++库 ...
- 记录第一次在egret项目中使用Puremvc
这几天跟着另一个前端在做一个小游戏,使用的是egret引擎和puremvc框架,这对于我来说还是个比较大的突破吧,特此记录下. 因为在此项目中真是的用到了mvc及面向对象编程,值得学习 记录第一次在e ...
- Java反编译Jar包和Android APK(类似.NET Reflector)
JD-GUI 这个JD-GUI可以反编译jar包,用法就是打开jar包直接浏览. JD-Eclipse JD-Eclipse是个Eclipse插件,安装方法是打开Eclipse,菜单 Help – & ...
- 【错误记录】Android Studio 编译报错 ( Could not determine java version from ‘11.0.8‘. ② | 升级 Gradle 版本 )
文章目录 一.报错信息 二.解决方案 解决 Could not determine java version from '11.0.8'. 问题 , 有两种方案 , 方案一 : Android Stu ...
最新文章
- POJ - 2584 T-Shirt Gumbo 二分多重匹配
- Spring Boot中使用JavaMailSender发送邮件
- android 自定义相册选择,Android通过手机拍照或从本地相册选取图片设置头像
- Nike推Nike Fit可轻松丈量足部尺寸与推荐鞋款
- nodejs是用来做什么的?
- SqlMapConfig.xml配置文件---Mybatis学习笔记(七)
- 盘点9 个实用的 JSON 工具
- 代码质量在「内卷时代」的重要性
- 前端学习(2491):refused to apply style from ‘‘ because its MIME type (‘text/html‘) is not a supported sty
- linux文件操作命令介绍(一)
- 【2019.08.21】2019杭电多校第十场
- c 找不到mysql.h_Linux下C连接MySQL找不到MySQL.H的问题
- LayaAir cacheAs 缓存与 visible 隐藏
- rsync linux 教程,rsync 用法教程
- 把IMAGE组件模式窗口化。
- thing.js入门学习
- TortoiseCVS 安装遇到的一些问题
- jQuery 之过滤选择器
- 应用不能远程访问RabbitMQ的5672端口
- html显示器对象属性,Web网站中利用JavaScript中ActiveXObject对象获取硬件信息(显示器数量、分辨率)从而进行单双屏跳转...
热门文章
- iOS计算输入字符数
- Git与SVN区别 \git学习
- svn update -r m path 代码还原到某个版本(这样之前的log日志也就没了,也就是清空log日志)...
- [Leetcode]50. Pow(x, n)
- 似然估计中为什么要取对数以GMM为例
- Jquery通过ajax请求NodeJS返回json数据
- ThinkPHP的field方法的用法总结
- 使用C#+Linq+SQL快速开发业务
- ASP.NET MVC:4 Ways To Prevent Duplicate Form Submission(转载)
- BZOJ1083: [SCOI2005]繁忙的都市