Android Studio 查看so包内函数列表、编写so包
1 使用命令行Terminal查看
2 复制.so文件 绝对路径
文件导航窗切换为project模式,选中 .so 文件 鼠标右击选项 copy 扩展选项中 选择 adsolute Path并复制
3 使用命令查看
objdump -tT C:\CustomData\Sigbit\Android\AccessDoorControl_School_megvii_new\app\libs\armeabi-v7a\libposutil.so
我的 adsolute Path 为 C:\CustomData\Sigbit\Android\AccessDoorControl_School_megvii_new\app\libs\armeabi-v7a\libposutil.so
Java_ 开头的方法可以直接使用
4 使用so库函数与底层硬件通信
4.1 so库作用
底层硬件通信 | 描述 |
---|---|
汽车灯光控制 | UI->JAVA->jNI->c |
JNI是C基于jni规范编写的代码,用于被JAVA调用C/C++方法
4.2 在硬件库/SDK或底层库之间搭建通信中介 so库
- Android平台如果要调用一些C/C++语言的所编译生成的库的函数一般要进行以下几个步骤。
确保我们的so库是用 ndk 或者 arm-linux-androideabi-gcc编译而成。如果我们的安卓应用程序是在studio中开发用java所写,那么我们 需要配置以下内容:
- 配置NDK到AS中,gradle.properties文件配置
android.useDeprecatedNdk=true
- 创建一个类并实现Jni规范中本地方法
public class NdkBuild {
static {
System.loadLibrary("PosUtil"); //PosUtil 是so库的名字
}
public static native int setFlushLedPower(int powerStatus);
public synchronized static native int setLedPower(int powerStatus);
public synchronized static native int getPriximitySensorStatus();
//搭建通信中介 so库目的就是调用没有jni规范的c/c++函数
}
- 使用so包实现的java 接口,如下加载pos机硬件posutil.so库函数
public class PosUtil {
public synchronized static native int setFlushLedPower(int powerStatus);
public synchronized static native int setLedPower(int powerStatus);
public synchronized static native int getPriximitySensorStatus();
static {
System.loadLibrary("posutil");
}
}
- studio/ Build -> rebuild,为类生成.class文件
- 调用jdk中的javah,为.class文件生成一个.h文件
- 在app目录下创建jni文件夹,将.h文件放入,
- 创建.c/.cpp文件实现.h中函数,这些函数中可以调用第三方的so库
- 将函数涉及的三方so/三方c/c++源码及.h放入jni目录下
- 书写Android.mk 及 Application.mk文件,描述编译规程
- 打开Terminal 调用命令行进行ndk-build编译,会在libs目录下生成.so文件,
- 注意studio默认寻找的路径是jnilibs,如果不想改gradle的话可以直接在jni下创建jnilibs目录,将.so放入。
- 编译完成以后在类中直接调用开始定义的native方法进行与c语言的通信。
5 Linux下查看so包内函数列表
nm -D 7z.so
objdump -tT 7z.so
6 Linux 基于qt中用c++使用so包
- 将so库直接在pro文件中LIB中进行引用,或调用项目在build apk 选项中add library中添加。
- 将.h在.pro中引入。
- 在.cpp中直接调用。