关于Android开发中Java对于.so库的调用
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于Android开发中Java对于.so库的调用相关的知识,希望对你有一定的参考价值。
现在在一款android系统的手持机上开发一个软件。
手持机的厂家提供了一个SDK,包括一个jar包(对于里面的.class文件中的接口有详细介绍)和一个.so库(没有源码,没有.h文件,一个裸的.so库)。他们的说法是有这些足够开发用的,再问就没下文了。。。刚在别的回答里看到的是一个裸的.so库是看不出来接口和函数的……愁。
我电脑的系统是win7,之前没有做过使用.so库的研发,所以现在一头雾水,有没有了解这方面的朋友给说说这是什么原理?我试过反编译.class文件,乱七八糟……只能通过猜测是.so中编译的是有关于手持机底层的东西,然后.class中好像是调用了.so中的函数,这个猜测靠谱么?如果这样猜测是对的,那就是说我只管编Java的源码,在源码中调用jar包里提供的接口,然后再下面就不用管了,jar包和.so直接是联系好了的??
我是赶架子上鸭给整到这个项目来了。。。请懂的朋友解答一下,谢谢!
补充一下:那个.so库的名称是libXyz.so,我在jar包里找到了一个XyzJNI.class,反编译完了是
public class XyzJNI
// 一堆变量的设置
static
System.loadLibrary("Xyz");
就这点东西。。反编译没办法。不过里面有System.loadLibrary("Xyz");一句,是不是说我只要调用到了这个.class提供的接口,就不用在源码中单独调.so了?
1.比如我现在在用net.sqlcipher.database 这个加密库(网上能搜得到的,用于数据库加密)。 那么我现在就在项目用加载这个jar包(在你的项目单击右键-》属性-》Java Build Path-》Libraries-》Add Jars,选择提供给你的jar包,我这里是 sqlcipher.jar,然后在Order and Export勾选你刚刚加载的 jar包。)
2.打开你的workspace目录,在你的项目目录下创建一个文件夹libs(如果文件夹不存在的话),然后将提供给你的so库放入该目录,基本架构就算是搭建好了。
3.进行开发,这里你需要问一下提供给你jar包的厂家,基本的用法,否则的话是无法进行开发的,因为你都不知道怎么去用。 sqlcipher的基本用法是:
SQLiteDatabase.loadLibs(this); //加载 so库文件,你的厂家的方法应该也是类似。
File databaseFile = getDatabasePath(SQLite_toll.DATABASE_NAME);
databaseFile.mkdirs();
databaseFile.delete();
SQLiteDatabase database = SQLiteDatabase.openOrCreateDatabase(databaseFile, helper_SharedPreferences.get_str_sp("database_cipher",this), null);
SQLite_toll initToll = new SQLite_toll(this, avaSys);
initToll.onCreate(database);
database.close();
//因为我sqlcipher是用于数据库加密的,所以你所看到的都是数据库的一些方法,你厂家提供给你的jar包的用法,你是要去问他们的,或者他们的是否有开源代码,又或者是网上也有很多人使用,那么能搜到相关资料。
根据你补充的提问,那么就是System.loadLibrary(this); ,就可以调用了 参考技术A android掉用c的so包就是通过jni , 应该给你的jar包就是用来调用so包的 。不会让你直接掉so包的放心。so包一般都是为了保证核心代码不被反编译 ,另外就是效率高才会用,或者就是开发游戏 。 他们说够用应该是jar包已经和so包的jni调用接口都调好了 , 你用jar包就行了 参考技术B .so是使用jni技术将底层c/c++实现的部分透明,你只需要调用System.loadLibrary(****)就可以与底层互动,jar是将你java层的代码封装了,你只需要调用就OK了
以上是关于关于Android开发中Java对于.so库的调用的主要内容,如果未能解决你的问题,请参考以下文章