对于java来说,jar文件和so文件都可以认为是Library文件(库文件),但是本质上还是有区别的;

jar文件:是有java编写的打包的库文件;

so文件:是由C或者C++文件编写的库文件,然后通过jni(本地方法编译)技术,编译的库文件;

如果是Windows上,就可以通过VS编译dll应用;如果是Android上应用的,用的就是动过NDK编译的;如果是IOS,就需要通过相关平台编译; 



在Android工程中:

jar文件,一般放在libs文件夹中;

so文件,一般放在jniLibs文件夹中;(注意,L大写);


AndroidStudio导入jar文件

一般Androidstudio生成的工程中有libs文件夹,只是在控制界面上没有直接显示;

1:我们可以直接打开工程目录,在 MyApplication\app目录下就有libs文件夹;

2:将jar文件复制到libs文件夹中;

3:右键点击刚才复制的jar文件,选择“Add As Library”, 会自动生成相关的一些文件,然后就可以应用相关jar中的类了;




 AndroidStudio导入so文件

方法一:

默认情况下的工程没有jniLibs文件夹,需要手动建立;

1:建立jniLibs的路径在:src---main--jniLibs;就是在main文件夹下建立jniLibs文件夹;

相关的so文件不是直接copy到jniLibs目录中,而是还有其所在的文件夹;


so文件目录结构:from:

|---src  

|---main 

|---jniLibs 

|---arm64-v8a  

|---libhello-jni.so  

|---armeabi  

|---libhello-jni.so  

|---armeabi-v7a  

|---libhello-jni.so  

|---x86  

|---libhello-jni.so  

|---x86_64  

|---libhello-jni.so  

|---mips  

|---libhello-jni.so  

|---mips64  

|---libhello-jni.so


方法二:

当然也可以指定任何目录,但是需要修改build.gradle文件;


android { sourceSets { main { jniLibs.srcDirs = ['libs'] }}

参数libs可以是自己只指定的任意文件夹;









so文件的调用:

加入so文件到内存;

java中可以直接通过绝对路径调用;

Android中给了一个简单的函数实现, 

System.loadLibrary("hello-jni");


方法一:可以通过静态代码块加载;

static
{
    System.loadLibrary("hello-jni");
}



方法二:

在程序初始化的时候加载,或者在你调用so中的代码前加载;



需要注意的是:System.loadLibrary的参数名字是so的名称,但是不要前面的lib和后面的后缀.so;

如:我添加的so文件是: libhello-jni.so

但是我调用的方式是:     System.loadLibrary("hello-jni");

否则程序会提示找不到库文件;