关于Android开发中Java对于.so库的调用
现在在一款Android系统的手持机上开发一个软件。手持机的厂家提供了一个SDK,包括一个jar包(对于里面的.class文件中的接口有详细介绍)和一个.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了? 展开
手持机的厂家提供了一个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了? 展开
3个回答
展开全部
厂家并没有欺骗你或者是含糊你的意思,确实是只提供给你jar包以及 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); ,就可以调用了
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); ,就可以调用了
展开全部
android掉用c的so包就是通过jni , 应该给你的jar包就是用来调用so包的 。不会让你直接掉so包的放心。so包一般都是为了保证核心代码不被反编译 ,另外就是效率高才会用,或者就是开发游戏 。 他们说够用应该是jar包已经和so包的jni调用接口都调好了 , 你用jar包就行了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
.so是使用jni技术将底层c/c++实现的部分透明,你只需要调用System.loadLibrary(****)就可以与底层互动,jar是将你java层的代码封装了,你只需要调用就OK了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询