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包的入门操作相关推荐

  1. 【Android 热修复】运行 Tinker 官方示例 ( 处理 TINKER_ID 问题 | 编译 debug 包 | 修改 Gradle 脚本 | 生成 patch 包 | 热修复 )

    文章目录 一.下载官方示例源码 二.处理 TINKER_ID 问题 三.编译 debug 包 四.安装 APK 并运行 五.修改 Gradle 构建脚本中的文件名称 六.修改程序逻辑代码 七.生成 p ...

  2. 记录第一次使用linux部署springbootweb项目

    记录第一次使用linux部署springbootweb项目 收获感受 经过一下午的安装虚拟机.Linux系统.JDK1.8,项目打包,解决bug,终于项目部署成功!哈哈哈哈哈哈哈哈哈 收获还是不错的, ...

  3. java jni编译_从源码编译Android系统的Java类库和JNI动态库的方法

    利用源码编译Android系统Java类库 1.编写Java项目和Android.mk文件 ├── Android.mk └── src └── com └── lhw └── framework └ ...

  4. 记录第一次上线(阿里云为例 springboot+vue)

    记录第一次上线的过程 因为是个小白,又因为疫情的原因,并且阿里大大很大气的送了一个服务器,正好临近毕业毕业设计快要完成,就想着能够上线试试看,然后学着配置服务器,买了一个域名!后面就讲接下来的遇见的很 ...

  5. Android聚合SDK母包反编译出包教程

    文章目录 [前言] 一.SDK预处理 1.SDK资源合并 1.1.合并res目录下的资源 1.2.合并libs目录 1.3.合并assets目录 1.4.合并AndroidManifest.xml 1 ...

  6. Cmake + CMakeLists.txt 编译SO库(JNI编译)

    cmake android-ndk google demo- https://github.com/googlesamples/android-ndk 在Android Studio中使用C/C++库 ...

  7. 记录第一次在egret项目中使用Puremvc

    这几天跟着另一个前端在做一个小游戏,使用的是egret引擎和puremvc框架,这对于我来说还是个比较大的突破吧,特此记录下. 因为在此项目中真是的用到了mvc及面向对象编程,值得学习 记录第一次在e ...

  8. Java反编译Jar包和Android APK(类似.NET Reflector)

    JD-GUI 这个JD-GUI可以反编译jar包,用法就是打开jar包直接浏览. JD-Eclipse JD-Eclipse是个Eclipse插件,安装方法是打开Eclipse,菜单 Help – & ...

  9. 【错误记录】Android Studio 编译报错 ( Could not determine java version from ‘11.0.8‘. ② | 升级 Gradle 版本 )

    文章目录 一.报错信息 二.解决方案 解决 Could not determine java version from '11.0.8'. 问题 , 有两种方案 , 方案一 : Android Stu ...

最新文章

  1. POJ - 2584 T-Shirt Gumbo 二分多重匹配
  2. Spring Boot中使用JavaMailSender发送邮件
  3. android 自定义相册选择,Android通过手机拍照或从本地相册选取图片设置头像
  4. Nike推Nike Fit可轻松丈量足部尺寸与推荐鞋款
  5. nodejs是用来做什么的?
  6. SqlMapConfig.xml配置文件---Mybatis学习笔记(七)
  7. 盘点9 个实用的 JSON 工具
  8. 代码质量在「内卷时代」的重要性
  9. 前端学习(2491):refused to apply style from ‘‘ because its MIME type (‘text/html‘) is not a supported sty
  10. linux文件操作命令介绍(一)
  11. 【2019.08.21】2019杭电多校第十场
  12. c 找不到mysql.h_Linux下C连接MySQL找不到MySQL.H的问题
  13. LayaAir cacheAs 缓存与 visible 隐藏
  14. rsync linux 教程,rsync 用法教程
  15. 把IMAGE组件模式窗口化。
  16. thing.js入门学习
  17. TortoiseCVS 安装遇到的一些问题
  18. jQuery 之过滤选择器
  19. 应用不能远程访问RabbitMQ的5672端口
  20. html显示器对象属性,Web网站中利用JavaScript中ActiveXObject对象获取硬件信息(显示器数量、分辨率)从而进行单双屏跳转...

热门文章

  1. iOS计算输入字符数
  2. Git与SVN区别 \git学习
  3. svn update -r m path 代码还原到某个版本(这样之前的log日志也就没了,也就是清空log日志)...
  4. [Leetcode]50. Pow(x, n)
  5. 似然估计中为什么要取对数以GMM为例
  6. Jquery通过ajax请求NodeJS返回json数据
  7. ThinkPHP的field方法的用法总结
  8. 使用C#+Linq+SQL快速开发业务
  9. ASP.NET MVC:4 Ways To Prevent Duplicate Form Submission(转载)
  10. BZOJ1083: [SCOI2005]繁忙的都市