JNI开发笔记(六)--一种更规范的so库生成方法
一种更规范的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库生成方法相关推荐
- JNI开发笔记(八)--Java读取txt文件进行JNI测试
Java读取txt文件进行JNI测试 引 前言 1. 新建assets文件夹 2. 载入测试文件 3. 建立文件读取方法 4. 在MainActivity中读取文件数据 引 JNI开发笔记(一)–An ...
- JNI开发笔记(七)--aar库的生成和调用
aar库的生成和调用 引 前言 1. 新建一个空工程 2. 新建一个Module 3. 移植JNI工程到Module中 4. 生成aar库与so库 5. 在另一个工程中调用aar库 引 JNI开发笔记 ...
- JNI开发笔记(四)--实现一个简单的JNI工程并生成so库
实现一个简单的JNI工程并生成so库 引 前言 1. 编写C/h文件并添加到工程 2. 修改CmakeLists.txt文件 3. 编写native-lib.cpp文件 4. 在MainActivit ...
- iOS开发笔记-两种单例模式的写法
iOS开发笔记-两种单例模式的写法 单例模式是开发中最常用的写法之一,iOS的单例模式有两种官方写法,如下: 不使用GCD #import "ServiceManager.h"st ...
- JNI开发笔记(五)--JNI语法总结
JNI语法总结 引 前言 1. 传参类型为变量/变量指针 1.1 变量 1.2 变量指针 2. 传参类型为数组指针 3. 传参类型为结构体指针 引 JNI开发笔记(一)–Android Studio安 ...
- JNI开发笔记(三)--JNI工程的框架分析
JNI工程的框架分析 引 1. JNI工程的组成部分 2. 各个部分之间的关系 引 JNI开发笔记(一)–Android Studio安装与环境搭建 JNI开发笔记(二)–创建JNI基础工程并运行 1 ...
- JNI开发笔记(二)--创建JNI基础工程并运行
创建JNI基础工程并运行 引 1. 创建JNI工程 2. 添加虚拟手机设备 3. 运行JNI基础工程 引 JNI开发笔记(一)–Android Studio安装与环境搭建 1. 创建JNI工程 And ...
- java 内部类 单例_确保对象的唯一性——单例模式 (四):一种更好的单例实现方法(静态内部类)...
3.5 一种更好的单例实现方法 饿汉式单例类不能实现延迟加载,不管将来用不用始终占据内存:懒汉式单例类线程安全控制烦琐,而且性能受影响.可见,无论是饿汉式单例还是懒汉式单例都存在这样那样的问题,有没有 ...
- 快递取件码生成软件_一种分布式的取件码生成方法技术
[技术实现步骤摘要] 本专利技术涉及样品柜取件码生成 ,特别涉及一种分布式的取件码生成方法. 技术介绍 在快递柜的领域中,快递员进行快件派送的时候,通常会遇到收件人无法立刻来取件的情况,这样就需要快递 ...
最新文章
- 图解Redis事务机制
- 工厂方法模式和简单工厂模式的区别
- 基于qt和mysql的地铁线路系统_[源码和文档分享]基于QT实现的可视化地铁换乘查询系统...
- 相当于零负担的延时程序(转)
- C语言实现随机快速排序random quick sort算法(附完整源码)
- VScode配置eslint保存自动格式化,eslint格式化去掉分号和双引号。vscode自动保存去掉分号和双引号;““
- Windows 使用浮动键盘语言栏
- php sql慢查询,Select多行SQL语句慢查询优化
- 使用ASP.NET MVC构建HTML5离线web应用程序
- 适合win7的python版本_Python 3.9 发布,不再支持 Win7!
- ucore Lab 1 系统软件启动过程
- 为什么现在不看好 CV 方向了呢?
- Python实战|「甜点消消」游戏数据分析过程
- vb wps 链接单元格_wps如何超链接wps表格.doc
- 向量运算(点积,叉积)
- 正则表达式-RegExp-常用正则表达式
- 惠普ZBook 14u G5(3XG37PA)电脑 Hackintosh 黑苹果efi引导文件
- 你的伙伴对你最大会话_甜炸了的表白套路对话 套路深到你无法拒绝
- Vue 中路由传参(动态路由匹配)
- linux shell 进程监控脚本,shell脚本监控进程
热门文章
- matlab摩擦阵子,用simulink仿真lugre摩擦模型时出现错误该如何解决。
- oracle rtrim(),Oracle ltrim() rtrim() 函数详细用法
- Typora的图片根目录设置,
- Tomcat几种启动报错及解决办法
- java 中文转化为拼音
- 关于 RGB 的颜色认知
- centOS安装openoffice的方法
- servlet串行拦截器实现例子
- jQuery中文手册, jQuery API, jQuery UI, 分页插件 下载
- C#中各种数组的性能比较