对于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");
否则程序会提示找不到库文件;