博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何在Android中使用编译好的.so库【转http://billhoo.blog.51cto.com/2337751/1125559】
阅读量:5033 次
发布时间:2019-06-12

本文共 1813 字,大约阅读时间需要 6 分钟。

来源:

        在bill的上一篇文章中,已经成功编译并生成了一个动态库“libDemoModule.so”(没时间看前文的朋友,bill在本文后上传了“libDemoModule.so”的附件,下载后按照本文所述也可进行相关试验)。既然是库,就是拿来用的,而比起编译来说,使用就显得顺手多了。下面bill就简单地介绍下如何在另外一个android应用程序中使用这个库中的JNI接口“Java_com_nativetools_NativeDemo_max”。

        首先还是按部就班地新建一个android示例工程“UseSharedLibDemo”,版本android-api9

        仍然不厌其烦地运行一次,以确定我们的Demo工作正常。

        双击打开项目树,在“/libs”目录下新建文件夹“armeabi”(大小写敏感),并将我们之前准备好的库“libDemoModule.so”拷贝到该目录下以备使用。

        对于该库的使用,我们并不需要知道“max”这个函数是怎么实现的,只需要知道它的JNI接口就可以了,对于库“libDemoModule.so”中的“max”函数,现有接口如下:

  1. JNIEXPORT jint JNICALL 
  2. Java_com_nativetools_NativeDemo_max(JNIEnv *env, jobject jthis, jint a, jint b); 

        根据上述接口的描述,为了在本项目中使用这个接口,我们需要新建包“com.nativetools”,并在本包下新建类“NativeDemo”,如下:

        接着在类“NativeDemo”中加载库“libDemoModule.so”,并对本地方法“max”进行声明如下:

  1. package com.nativetools; 
  2.  
  3. public class NativeDemo { 
  4.     static { 
  5.         //加载需要使用的库 
  6.         System.loadLibrary("DemoModule"); 
  7.     } 
  8.  
  9.     //对库中的本地方法进行声明 
  10.     public native int max(int a, int b); 

        这里需要注意“System.loadLibrary("DemoModule")”中的“DemoModule”由我们的库名去掉前缀“lib”和后缀“.so”而来,并且大小写敏感,否则会出现诸如找不到函数的实现、加载库初始化失败之类的错误,比如我们把大写“D”改成小写“d”,报错如下,也为大家遇到错误后进行修正提供一个参考:

        然后,然后事情就结束了,我们剩下要做的仅仅是在需要使用max函数的地方导入我们的工具包并调用max进行相关计算:

  1. ... 
  2. //导入本地方法所在工具包 
  3. import com.nativetools.NativeDemo; 
  4.  
  5. public class MainActivity extends Activity { 
  6.  
  7.     @Override 
  8.     protected void onCreate(Bundle savedInstanceState) { 
  9.         super.onCreate(savedInstanceState); 
  10.         setContentView(R.layout.activity_main); 
  11.          
  12.         NativeDemo nativetool = new NativeDemo(); 
  13.          
  14.         //调用本地函数max 
  15.         Integer i = nativetool.max(1024512); 
  16.         new AlertDialog.Builder(this).setMessage(i.toString()).show(); 
  17.     } 
  18. ... 

        可以看到库中的“max”函数已经成功调用,需要注意的是,android端声明native code的代码需要严格按照JNI接口来组织,及本例中,JNI接口为

        这也是我们为什么要在项目中加入“com.nativetools.NativeDemo”这个类的原因。

Summary

        bill自己也是刚接触类似第三方库的使用,打心底里觉得本文还差很多东西,但自己也没法说清楚,于是仅仅将自己当前如何使用.so的方法进行了简要的说明,希望在以后的学习和工作中,能够深入而具体的习得这方面的知识和技巧。

转载于:https://www.cnblogs.com/songtzu/archive/2013/03/12/2955197.html

你可能感兴趣的文章
【jQuery UI 1.8 The User Interface Library for jQuery】.学习笔记.1.CSS框架和其他功能
查看>>
如何一个pdf文件拆分为若干个pdf文件
查看>>
web.xml中listener、 filter、servlet 加载顺序及其详解
查看>>
前端chrome浏览器调试总结
查看>>
获取手机验证码修改
查看>>
数据库连接
查看>>
python中数据的变量和字符串的常用使用方法
查看>>
等价类划分进阶篇
查看>>
delphi.指针.PChar
查看>>
Objective - C基础: 第四天 - 10.SEL类型的基本认识
查看>>
java 字符串转json,json转对象等等...
查看>>
极客前端部分题目收集【索引】
查看>>
第四天 selenium的安装及使用
查看>>
关于js的设计模式(简单工厂模式,构造函数模式,原型模式,混合模式,动态模式)...
查看>>
KMPnext数组循环节理解 HDU1358
查看>>
android调试debug快捷键
查看>>
【读书笔记】《HTTP权威指南》:Web Hosting
查看>>
Inoodb 存储引擎
查看>>
数据结构之查找算法总结笔记
查看>>
Linux内核OOM机制的详细分析
查看>>