Android Studio 查看so包内函数列表、编写so包

Android Studio 查看so包内函数列表、编写so包

      • 1 使用命令行Terminal查看
      • 2 复制.so文件 绝对路径
      • 3 使用命令查看
      • 4 使用so库函数与底层硬件通信
        • 4.1 so库作用
        • 4.2 在硬件库/SDK或底层库之间搭建通信中介 so库
      • 5 Linux下查看so包内函数列表
      • 6 Linux 基于qt中用c++使用so包

1 使用命令行Terminal查看

Android Studio 查看so包内函数列表、编写so包_第1张图片

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

Android Studio 查看so包内函数列表、编写so包_第2张图片
Java_ 开头的方法可以直接使用

4 使用so库函数与底层硬件通信

4.1 so库作用

底层硬件通信 描述
汽车灯光控制 UI->JAVA->jNI->c

JNI是C基于jni规范编写的代码,用于被JAVA调用C/C++方法

4.2 在硬件库/SDK或底层库之间搭建通信中介 so库

Native C/C++ 库
硬件SDK 硬件抽象层 /HAL
SO库
Android Runtime & 系统库
JAVA API Framework
  • 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中直接调用。

你可能感兴趣的:(Android,android,jni,linux,java,c++)