一种更规范的JNI工程写法

  • 前言
  • 1. MainActivity中的两个重要的语句
  • 2. 建立Util类来替代MainActivity
  • 3. 在MainActivity中验证JNI工程并生成so库

JNI开发笔记(一)–Android Studio安装与环境搭建
JNI开发笔记(二)–创建JNI基础工程并运行
JNI开发笔记(三)–JNI工程的框架分析
JNI开发笔记(四)–实现一个简单的JNI工程并生成so库
JNI开发笔记(五)–JNI语法总结

前言

在JNI开发笔记(四)中,我们用Android Studio中自带的JNI工程生成了一个so库,但是这样的so库是不太规范的,因为我们把加载库和native方法的定义都放在了MainActivity中,这样在其他工程中调用是很不方便,所以我们应该使用一种更规范的so库生成方法。

1. MainActivity中的两个重要的语句

在之前的工程中,MainActivity起着加载library,声明native方法以及测试JNI工程的作用。MainActivity对于JNI工程最重要的两个语句就是:

static {System.loadLibrary("JniTest-lib");
}

以及:

    /*** A native method that is implemented by the 'native-lib' native library,* which is packaged with this application.*/public native String stringFromJNI();public native int sumfunc(SumInput sumInput);

前者表示将JNI的lib加载进来,后者表示对lib中的native方法进行声明。其实MainActivity和我们的JNI工程之间是独立,如果将这两个功能交给MainActivity来完成的话,是很不规范的。

2. 建立Util类来替代MainActivity

我们需要一个util类来替代MainActivity去完成lib加载和native方法声明,这样的话,MainActivity就只是负责测试JNI工程是否能跑通,我们生成的so库也就能具有很好的移植性。我们根据JNI开发笔记(五)中的工程,只需要稍加修改就可以使生成的so库更加规范。

首先在MainActivity的包下,我们选中,并新建一个包:

包的名字叫做“com.jni.test.util”,这个包下,我们来实现JNI工程相关的加载lib和声明native方法:

在“com.jni.test.util”下new一个Java Class:

Class的名字我们叫做“JniTestUtil”:

在这个class中我们将MainActivity中的两个语块移动进来:

package com.jni.test.util;public class JniTestUtil {// 下面的内容都是从MainActivity中copy过来的,MainActivity中相同的语句可以删除// Used to load the 'native-lib' library on application startup.static {System.loadLibrary("JniTest-lib");}/*** A native method that is implemented by the 'native-lib' native library,* which is packaged with this application.*/public native String stringFromJNI();public native int sumfunc(SumInput sumInput);
}

同样的,我们将JNI工程需要的其他类(比如输入输出),移动到JniTestUtil同路径下:

这个时候我们发现,声明的native方法的名字是标红的:


那是因为我们把lib从MainActivity移动到了新的Class中,我们将native-lib.cpp中对应的函数名字更改就好了:

更改完毕发现标红消失了:


我们将一些类,比如“SumInput”改变了路径之后,函数中相应的路径也要做相应的更改:



到此为止,一个更标准的JNI工程就改动完毕了,下面我们在MainActivity来测试一下我们的工程。

3. 在MainActivity中验证JNI工程并生成so库

改动完毕之后,我们的MainActivity的作用只剩下测试JNI工程了,因为lib是在util类中加载的,所以我们使用JNI中的方法的时候需要额外import一下,所以MainActivity需要做一些小小的改动:


首先需要将两个class导入到MainActivity中,然后再使用JNI中的方法之前,需要new一个实体出来。其他不需要进行改动。

我们运行工程,可以看到结果运行正常:


经过MainActivity验证之后,我们可以根据JNI开发笔记(四)中生成so库的方法来生成so库:


此时的so库是比较标准,可以移植到第三方平台以供调用。

JNI开发笔记(六)--一种更规范的so库生成方法相关推荐

  1. JNI开发笔记(八)--Java读取txt文件进行JNI测试

    Java读取txt文件进行JNI测试 引 前言 1. 新建assets文件夹 2. 载入测试文件 3. 建立文件读取方法 4. 在MainActivity中读取文件数据 引 JNI开发笔记(一)–An ...

  2. JNI开发笔记(七)--aar库的生成和调用

    aar库的生成和调用 引 前言 1. 新建一个空工程 2. 新建一个Module 3. 移植JNI工程到Module中 4. 生成aar库与so库 5. 在另一个工程中调用aar库 引 JNI开发笔记 ...

  3. JNI开发笔记(四)--实现一个简单的JNI工程并生成so库

    实现一个简单的JNI工程并生成so库 引 前言 1. 编写C/h文件并添加到工程 2. 修改CmakeLists.txt文件 3. 编写native-lib.cpp文件 4. 在MainActivit ...

  4. iOS开发笔记-两种单例模式的写法

    iOS开发笔记-两种单例模式的写法 单例模式是开发中最常用的写法之一,iOS的单例模式有两种官方写法,如下: 不使用GCD #import "ServiceManager.h"st ...

  5. JNI开发笔记(五)--JNI语法总结

    JNI语法总结 引 前言 1. 传参类型为变量/变量指针 1.1 变量 1.2 变量指针 2. 传参类型为数组指针 3. 传参类型为结构体指针 引 JNI开发笔记(一)–Android Studio安 ...

  6. JNI开发笔记(三)--JNI工程的框架分析

    JNI工程的框架分析 引 1. JNI工程的组成部分 2. 各个部分之间的关系 引 JNI开发笔记(一)–Android Studio安装与环境搭建 JNI开发笔记(二)–创建JNI基础工程并运行 1 ...

  7. JNI开发笔记(二)--创建JNI基础工程并运行

    创建JNI基础工程并运行 引 1. 创建JNI工程 2. 添加虚拟手机设备 3. 运行JNI基础工程 引 JNI开发笔记(一)–Android Studio安装与环境搭建 1. 创建JNI工程 And ...

  8. java 内部类 单例_确保对象的唯一性——单例模式 (四):一种更好的单例实现方法(静态内部类)...

    3.5 一种更好的单例实现方法 饿汉式单例类不能实现延迟加载,不管将来用不用始终占据内存:懒汉式单例类线程安全控制烦琐,而且性能受影响.可见,无论是饿汉式单例还是懒汉式单例都存在这样那样的问题,有没有 ...

  9. 快递取件码生成软件_一种分布式的取件码生成方法技术

    [技术实现步骤摘要] 本专利技术涉及样品柜取件码生成 ,特别涉及一种分布式的取件码生成方法. 技术介绍 在快递柜的领域中,快递员进行快件派送的时候,通常会遇到收件人无法立刻来取件的情况,这样就需要快递 ...

最新文章

  1. 图解Redis事务机制
  2. 工厂方法模式和简单工厂模式的区别
  3. 基于qt和mysql的地铁线路系统_[源码和文档分享]基于QT实现的可视化地铁换乘查询系统...
  4. 相当于零负担的延时程序(转)
  5. C语言实现随机快速排序random quick sort算法(附完整源码)
  6. VScode配置eslint保存自动格式化,eslint格式化去掉分号和双引号。vscode自动保存去掉分号和双引号;““
  7. Windows 使用浮动键盘语言栏
  8. php sql慢查询,Select多行SQL语句慢查询优化
  9. 使用ASP.NET MVC构建HTML5离线web应用程序
  10. 适合win7的python版本_Python 3.9 发布,不再支持 Win7!
  11. ucore Lab 1 系统软件启动过程
  12. 为什么现在不看好 CV 方向了呢?
  13. Python实战|「甜点消消」游戏数据分析过程
  14. vb wps 链接单元格_wps如何超链接wps表格.doc
  15. 向量运算(点积,叉积)
  16. 正则表达式-RegExp-常用正则表达式
  17. 惠普ZBook 14u G5(3XG37PA)电脑 Hackintosh 黑苹果efi引导文件
  18. 你的伙伴对你最大会话_甜炸了的表白套路对话 套路深到你无法拒绝
  19. Vue 中路由传参(动态路由匹配)
  20. linux shell 进程监控脚本,shell脚本监控进程

热门文章

  1. matlab摩擦阵子,用simulink仿真lugre摩擦模型时出现错误该如何解决。
  2. oracle rtrim(),Oracle ltrim() rtrim() 函数详细用法
  3. Typora的图片根目录设置,
  4. Tomcat几种启动报错及解决办法
  5. java 中文转化为拼音
  6. 关于 RGB 的颜色认知
  7. centOS安装openoffice的方法
  8. servlet串行拦截器实现例子
  9. jQuery中文手册, jQuery API, jQuery UI, 分页插件 下载
  10. C#中各种数组的性能比较