1、放到安卓系统中,每个应用都可以访问
将编译好的libmono2so放到系统的/system/lib目录下。打开Eclipse上ADT插件里面的File Explorer工具,点击/system/lib目录,选择右上角有个push a file onto devices,打开对话框后,再选择libmono2so文件,确定后即可将lib文件放到手机中了。(如果不行也可以使用ADB自带adb push命令)。再设置其权限为744,命令如下:
#用命令行方式访问手机设备
adb shell
#进入/system/lib目录
cd /system/lib
#设置libmono2so权限为744
chmod 744 libmono2so
此时利用Jni机制编写装载Jni库方法的类,类里面需要严格按照Jni机制进行编写Jni接口
2、放到应用软件中,只有自己的应用可以访问
①在软件工程下新建libs/armeabi文件夹,并将libmono2so库拷贝进去。
②接下来做的就是重写Jni接口,和方法1的最后过程是一样的。用Eclipse编译工程,若工程下有libs目录,会自动将里面的so库编译到apk包中。我现在需要用到so库和Androidmk文件编译工程,但用Eclipse编译时,Androidmk不起作用。Androidmk好像只有在通过源代码编译工程时才起作用(我目前只发现这个法),即在Linux环境下的Android源代码目录中,通过make或mmm命令编译。但通过mmm编译的工程,不会把工程下libs目前中的so库添加进apk包里,是不是要在Androidmk文件中添加一些申明什么的?还有,想知道Android源代码中,重启手机的相关代码在哪个部分。Android中加载so文件的提供的API:
void Systemload(String pathName);
说明:
1、pathName:文件名+文件路劲;
2、该方法调用成功后so文件中的导出函数都将插入的系统提供的一个映射表(类型Map);
看到以上对Systemload(String pathName);的函数说明可定有人会想到将so文件放到一个指定的目录然后再通过参数pathName直接引用该目录的路劲和对应的so文件问题不就解决了吗?
这里有个问题被忽略了,那就是Systemload只能加载两个目录路劲下的so文件:
1、/system/lib ;
2、安装包的路劲,即:/data/data/<packagename>/…
而且这两个路劲又是有权限保护的不能直接访问;
问题解决方法:
先从网络下载so文件到手机目录(如:/test/device/testso) –> 将testso加载到内存(ByteArrayOutputStream) –> 然后保存到对用安装包目录;
具体代码如下:
try {
String localPath = EnvironmentgetExternalStorageDirectory() + path;
Logv(TAG, “LazyBandingLib localPath:” + localPath);
String[] tokens = mPatternssplit(path);
if (null == tokens || tokenslength <= 0
|| tokens[tokenslength - 1] == “”) {
Logv(TAG, “非法的文件路径!”);
return -3;
}
// 开辟一个输入流
File inFile = new File(localPath);
// 判断需加载的文件是否存在
if (!inFileexists()) {
// 下载远程驱动文件
Logv(TAG, inFilegetAbsolutePath() + ” is not fond!”);
return 1;
}
FileInputStream fis = new FileInputStream(inFile);
File dir = contextgetDir(“libs”, ContextMODE_PRIVATE);
// 获取驱动文件输出流
File soFile = new File(dir, tokens[tokenslength - 1]);
if (!soFileexists()) {
Logv(TAG, “### ” + soFilegetAbsolutePath() + ” is not exists”);
FileOutputStream fos = new FileOutputStream(soFile);
Logv(TAG, “FileOutputStream:” + fostoString() + “,tokens:”
+ tokens[tokenslength - 1]);
// 字节数组输出流,写入到内存中(ram)
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = -1;
while ((len = fisread(buffer)) != -1) {
baoswrite(buffer, 0, len);
}
// 从内存到写入到具体文件
foswrite(baostoByteArray());
// 关闭文件流
baosclose();
fosclose();
}
fisclose();
Logv(TAG, “### Systemload start”);
// 加载外设驱动
Systemload(soFilegetAbsolutePath());
Logv(TAG, “### Systemload End”);
return 0;
} catch (Exception e) {
Logv(TAG, “Exception ” + egetMessage());
eprintStackTrace();
return -1;
}
这个是linux系统下的文件,你的手机应该是安卓平台,安卓平台是从linux内核的基础上发展过来的,所以会有后缀为so(shared object)的文件,当然这样解释不够精确、详细,肯定会被吐槽,具体如下:
准确地、详细地来说,
手机里面有硬件,也就是弱电学中的电路,电路组成了CPU和协助CPU的外围电路,
CPU上面移植了Linux内核,好,接下来就开始百花齐放了:
1、有的手机跑的是安卓的系统
2、有的时候跑的是linux系统
他们都基于Linux内核,对于Linux内核有不同的扩充,有的扩充成A系统,叫安卓,有的扩充成B系统,叫Linux,但是手机上,安卓相对linux,更加流行。
而Linux内核,并不是唯一的,有正统的,也有非正统的(不太常见而已),而Linux内核对应的CPU结构,也有很多种,因此不同的智能手机可能有不同的CPU、不同的Linux内核和不同的安卓系统(这个系统里包含了Linux内核)
当然还有跑windows的,扯远了,windows的手机,里面应该可以找dll文件,这个对应安卓系统的so文件。
还没讲so文件是干嘛的~
那为什么起个名字叫share object?
这个so文件,有时候是直接被调用的,有时候是会参与到编译中的,也就是说,一个so文件可能会被多个应用程序用到,因此取名叫share object(share:大家一起来分享使用的意思)。
这个就和windows里面一样,如果有时候百度下载了几个调用dll文件的软件,恰好电脑里面缺这几个dll,那么此时,这几个软件将不能运行,也就是说,这几个dll会被这几个软件在运行时都用到,有share的味道,所以在windows里面叫链接库,在Linux内核的系统上(可以是ubuntu啊、redhat啊,android等等)叫so(shared object),作用类似,windows中起名字更严肃点(链接文件,编译带上它,像一条链条一样),linux对它的起名更形象些(大家分享一起来用),意思差不多。当然区别肯定会有,这里只是回答得让读者大致理解,具体细节上的差别请另外百度。
so文件怎么运作的?(下面两个步骤摘自百度)
###########################################
①编译阶段。链接编辑器(linkeditor)拿它和其他Relocatableobjectfile以及其他sharedobjectfile作为输入,经链接处理后,生存另外的sharedobjectfile或者executablefile。
②运行阶段。动态链接器(dynamic linker)拿它和一个executable file以及另外一些 shared object file 来一起处理,在Linux系统里面创建一个进程映像。
这段话看起来比较抽象,如果想迅速理解它,建议读者百度找一个gcc/g++运行helloworld的例子就理解了.
###########################################
所以大家爱吐槽啊,这个C牌子的智能手机,怎么刷不了那个D牌手机 官方系统包啊?出来各种问题,有些问题是可以解决的,有些是解决不了的,甚至会有烧机的情况。
这类问题和底层的CPU种类、Linux内核种类及版本、so文件版本等都是相关的。
所以有些牌子的智能机有通吃现象,可以刷其他牌子的各种官方系统,有的智能机则不行。
总结:
CPU和PCB外围电路=>Linux内核+应用组件组成的安卓系统(用户层)=>对so文件和其他文件一起编译=>对so文件和其他文件一起运行=>创立进程、线程(也就是手机上的各种app和系统自带功能)=>然后我们就可以使用手机上的各种功能了。
最后,以上回答只是为了让读者有初步的、粗略的、大致的理解。任何专业名词和术语只要打了比方,就肯定是不绝对精确的。更详细的细节,请参考专业文献。
手机里面的so文件,如果是应用软件的,删除后,应用软件请重装,如果是系统自带的,请尽量不要删除。
抛砖引玉,答得不好,请别骂,谢谢!
-----------------------------------
补充:
评论中提到了FreeBSD,我来说下怎么回事:
*** 作系统=userland(用户层)+Linux内核
Android使用的是FreeBSD内核(其实是用户层,当然你也可以说他是内核)+Linux内核
Ubuntu使用的是GNU(用户层)+Linux内核
用户层啥意思:
我花了钱你不至于还让我看底层电路底层的010101吧?买来当然是为了王者农药对不?
通俗地讲:就是屏蔽底层细节,让客户买来直接用.
计算机里面为啥会有0和1
本质是电路中的高电平和低电平,举例:
05V->bit 1
01V->bit 0
才疏学浅,抛砖引玉,答得不好,请别骂,谢谢!
-----------------------------------
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)