移植Linux标准动态库到Android,有两种方法,一种是利用编译工具链,将Linux标准动态库源码编译成so,放入Android工程的jniLibs对应的CPU目录下。另外一种方法是,提取标准动态库的c和h文件,放入Android工程的jni目录下,利用Android Studio下Ndk-build,在build目录下生成so,最终将其拷贝到jniLibs对应的CPU目录下。
下面讲解移植Linux Pcap库(libpcap-1.9.0.tar.gz),并在Android工程上对此进行验证。
我们采用第一种方法,即使用编译工具链。
第一步,我们先在Linux环境上安装Android NDK,然后设置如下环境变量。
第二步,执行“./configure --host=aarch64-linux-android”生成Makefile文件。
第三步,编写JNI接口,即在libpcap-1.9.0目录下新建androidpcap.c实现JNI接口。我们可以把pcap.c的头文件部分全部拷贝过来,然后包含jni.h头文件,我们沿用之前搭建NDK的环境,我们在
Java_com_example_ndktest_MainActivity_stringFromJNI
函数内调用pcap_findalldevs接口,返回相应的结果。
需要注意PCAP_API声明,没有这个宏,该函数则会编译生成local函数,只有加了PCAP_API,最终动态库中这个函数才能被其他文件调用。
第四步,修改Makefile,保证能编译到新增JNI接口对应的文件,主要修改如下三点。
第五步,最后我们执行make,生成对应的so文件libpcap.so.1.9.0,重命名后将so拷贝到jniLibs目录下。
关于如何验证这个so,我们仍然利用之前搭建的Android NDK开发环境,Android 工程代码保持不变,修改stringFromJNI的入参wlan0,核心代码如下所示。
将最终的APK安装到Android手机,测试结果如下所示,该结果表明Linux动态库移植到Android方法是正确的,至于为什么Native层调用pcap的接口返回错误,可以作后续思考。
欢迎扫码关注,一起学习