.so的创建和调用有一个特点,我们要知道.so的调用并不一定必须在Activity中进行,那么制作时也并不一定要在Activity中,但是,一旦.so制作成功,那么再调用时,调用的java类就必须跟制作.so时的java类(包括路径和类名)必须一致!
举个例子:拿上篇文章来说,我在创建.so时是在MainActivity中调用的,路径名是com.byl.jnitest,那么最终生成的.so想要在其他项目中使用,调用其的类就必须是com.byl.jnitest.MainActivity,不能是其它任何类,否则报错。这样一来岂不是局限性非常大,而且特别不人性化?是的,但是我前面说过,.so的调用并不一定必须在Activity中进行,制作时也并不一定要在Activity中,所以我们可以另外创建一个util类来调用.so,并最终将该类封装为一个jar和.so配套使用,由此我们也可以窥探出其他第三方sdk总是x个jar和x个so配对使用的原因!
好了,接下来我们重新建立一个AS项目jnitest2,随后创建一个专门调用so的java类JniUtil:
JniUtil.java:
package com.byl.jnitest2; /** * Created by baiyuliang on 2016-4-5. */ public class JniUtil { public static native String getSec();//.so中的方法名 static{ System.loadLibrary("jnitest2");//加载.so } }
MainActivity.java:
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.e("jj", JniUtil.getSec()); } }
jni文件夹下的.h和.c文件:
注意.h的命名要和调用so的类名一致!
com_byl_jnitest2_JniUtil.h:(注意路径名)
/* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class com_byl_jnitest2_JniUtil */ #ifndef _Included_com_byl_jnitest2_JniUtil #define _Included_com_byl_jnitest2_JniUtil #ifdef __cplusplus extern "C" { #endif /* * Class: com_byl_jnitest2_JniUtil * Method: getSec * Signature: ()Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_com_byl_jnitest2_JniUtil_getSec (JNIEnv *, jclass); #ifdef __cplusplus } #endif #endif
jnitest.c:
#include <string.h> #include <jni.h> jstring Java_com_byl_jnitest2_JniUtil_getSec (JNIEnv* env,jobject thiz){ return (*env)->NewStringUTF(env,"调用jni成功"); }
其它步骤不在书写,按照上篇文章的步骤,最终生成我们所要的so文件libjnitest2.so:
运行结果:
成功,好了,接下来我们看如何将这个so应用到其它项目中:
首先我们要将JniUtil这个类打包成一个jar>>jniutil.jar:
接着我们再次创建一个新的AS项目jnitest3来测试生成的so和封装的jar,并将so和jar依次添加进项目中:
在MainActivity中调用so方法:
运行结果:
这样封装过后,对于so的调用就变得异常简单,那么对于一些项目中使用的密文则可以直接使用这种方法处理了!
经过这几篇文章,你是否对jni、so的生成过程以及使用有了一个初步的认识呢?
.so的封装调用的更多相关文章
-
python(面向对象-类封装调用)
一.面对对象思想 (1)大家肯定听过 Python 中”一切皆对象“的说法,但可能并不了解它的具体含义,只是在学习的时候听说 Python 是面向对象的编程语言,本节将向大家详细介绍 Python 面 ...
-
HeadFirst设计模式笔记:(六)命令模式 —— 封装调用
1.概念 将来自客户端的请求传入一个对象,从而使你可用不同的请求对客户进行参数化.用于“行为请求者”与“行为实现者”解耦,可实现二者之间的松耦合,以便适应变化.分离变化与不变的因素. 在面向对象的程序 ...
-
iOS支付宝,微信,银联支付集成封装调用(下)
一.越来越多的app增加第三方的功能,可能app有不同的页面但调用相同的支付方式,例如界面如下: 这两个页面都会使用第三方支付支付:(微信,支付宝,银联)如果在每一个页面都直接调用第三方支付的接口全部 ...
-
Android对方向感应器的封装调用
Android自动的SensorManager使用起来已经很方便,但由于一些情况我们希望对其中的功能进行封装: 只使用个别的sensor,功能相对单一 要对sensor返回的raw data进行算法处 ...
-
python(类的封装调用/继承/多态)
一.类的定义 类:用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.对象是类的实例 对象:类实例化出来的叫做对象 对象和类的关系:类和对象的关系就像模具和铸 ...
-
JavaScript函数封装调用
举个列子:我们在写前端页面,经常会使用到Jquery文本框内容,来判断一下输入值是否符合,常见的写法: <script> function test(){ $("#ID" ...
-
.netcore 3.1高性能微服务架构:封装调用外部服务的接口方法--HttpClient客户端思路分析
众所周知,微服务架构是由一众微服务组成,项目中调用其他微服务接口更是常见的操作.为了便于调用外部接口,我们的常用思路一般都是封装一个外部接口的客户端,使用时候直接调用相应的方法.webservice或 ...
-
利用C++11可变模板,封装调用dll导出函数
起因 开发中经常需要动态调用一些导出函数,试着利用C++11特性封装一下 尝试 常规使用 typedef int WINAPI (*TMessageBoxA)(HWND hWnd,LPCSTR lpT ...
-
可方便扩展的JIRA Rest Web API的封装调用
JIRA是一个缺陷跟踪管理系统,被广泛应用于缺陷跟踪.客户服务.需求收集.流程审批.任务跟踪.项目跟踪和敏捷管理等工作领域,当我们需要把第三方业务系统集成进来时,可以调用他的API. JIRA本身的A ...
随机推荐
-
win10 localhost 解析为 ipv6地址 ::1 的解决办法
今天遇到个奇怪的问题,localhost 访问时提示 not found 404,但是有127.0.0.1可以访问.最后找到原因,是因为 windows 把 localhost 解析为 ipv6 地址 ...
-
css中的zoom的使用
css中的zoom的使用 zoom : normal | number normal : 默认值.使用对象的实际尺寸 number : 百分数 | 无符号浮点实数.浮点实数值为1.0或百分数为1 ...
-
获取dom元素的宽度和高度
一.获取css的大小 1.第一种通过内联样式 var box = document.getElementById('box'); var w = box.style.width; var h = bo ...
-
Git忽略文件方法【转】
转自:http://www.cnblogs.com/shangdawei/archive/2012/09/08/2676669.html http://cwind.iteye.com/blog/166 ...
-
javascript 笔记——setTimeout的参数问题
setTimeout("xxx",500) 双引号中的作用域不捕捉局部变量,因此会报错误 如果你需要在双引号中可以在外部定义一个变量 var now; window.onload ...
-
Linux---vi编辑器必会操作
移动光标: (1)基本的上下左右:通过箭头按键控制 (2)跳到一行的末尾:键盘"end" (3)跳到一行的开头:键盘"home" (4)跳到最后一行:shift ...
-
final, finally 和finalize的区别
final 修饰符(关键字) 如果一个类被声明为final,意味着它不能再派生新的子类,不能作为父类被继承.因此一个类不能及被声明为abstract,又被声明为final的.将变量或方法声明为fina ...
-
forward:hello 与 redirect:hello的区别
对于某些Controller的处理方法,当返回值为String类型时,返回的结果中可能含有forward或redirect前缀: 如: @Controller @RequestMapping(&quo ...
-
洛谷 P1305 新二叉树
P1305 新二叉树 题目描述 输入一串完全二叉树,用遍历前序打出. 输入输出格式 输入格式: 第一行为二叉树的节点数n. 后面n行,每一个字母为节点,后两个字母分别为其左右儿子. 空节点用*表示 输 ...
-
Openfire4源码部署到eclipse中并编译
Openfire4源码部署到eclipse中并编译 概述 Openfire是众所周知的基于xmpp协议的IM开源服务,所有操作,配置,监控,调试等以B/S方式进行展示,非常的方便管理员进行管理.它的强 ...