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 怎么调用类 android studio函数调用_jni

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 怎么调用类 android studio函数调用_android_02


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
objdump -tT

6 Linux 基于qt中用c++使用so包

  • 将so库直接在pro文件中LIB中进行引用,或调用项目在build apk 选项中add library中添加。
  • 将.h在.pro中引入。
  • 在.cpp中直接调用。