bill的上一篇文章【Win7下Android native code的编译和调试】中,已经成功编译并生成了一个动态库“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. JNIEXPORTjintJNICALL
  2. Java_com_nativetools_NativeDemo_max(JNIEnv*env,jobjectjthis,jinta,jintb);

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

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

        
  1. packagecom.nativetools;
  2. publicclassNativeDemo{
  3. static{
  4. //加载需要使用的库
  5. System.loadLibrary("DemoModule");
  6. }
  7. //对库中的本地方法进行声明
  8. publicnativeintmax(inta,intb);
  9. }

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

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

        
  1. ...
  2. //导入本地方法所在工具包
  3. importcom.nativetools.NativeDemo;
  4. publicclassMainActivityextendsActivity{
  5. @Override
  6. protectedvoidonCreate(BundlesavedInstanceState){
  7. super.onCreate(savedInstanceState);
  8. setContentView(R.layout.activity_main);
  9. NativeDemonativetool=newNativeDemo();
  10. //调用本地函数max
  11. Integeri=nativetool.max(1024,512);
  12. newAlertDialog.Builder(this).setMessage(i.toString()).show();
  13. }
  14. }
  15. ...

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

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

Summary

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

更多相关文章

  1. Android中如何处理耗时操作,AsyncTask有什么不足之处.
  2. 10.1 Android(安卓)NDK开发 一
  3. [Android初级]关于Android使用Proguard混淆打包的那些事
  4. Android:使用MediaPlayer播放本地音乐
  5. Android本地存储目录研究
  6. Android最新面试题汇总
  7. Android(安卓)贝塞尔曲线
  8. Android(安卓)C++回收机制
  9. Android(安卓)开发之多线程处理——Handler 详解

随机推荐

  1. “已有打开的与此命令相关联的 DataReade
  2. Oracle PLSQL 学习笔记三
  3. SQLSERVER 中表变量与临时表
  4. 急!如何得到sql数据库更新的日志?
  5. SHOW STATUS 查看各种类型SQL执行的频率
  6. 这个查询能用变量写出来吗?
  7. mysql创建任务事件
  8. 通向SQLServer安全级别3的楼梯:主体和安全
  9. mysql 千万级的 count统计对比
  10. 【安全牛学习笔记】MsSQL高级注入