接上一篇,上一篇主要是讲NDK简单入门,这一篇讲如何调用第三方so库。
至于为啥要使用NDK,我这里也简单总结一下NDK的优缺点:
优点:
1、运行效率高
2、重复利用代码。有很使用C或C++写好的开源库
3、代码保护。Java开发的代码容易被反编译,而C/C++的反编译比较难
4、便于移植。C/C++库可以移植到其他平台上
缺点:
1、开发难道高
2、调试难度高(看不到代码,已经编译成so库了)
回归正题,今天是学习怎么调用第三方so库
一、工具简介
操作系统 :Windows 7
Eclipse 版本:Luna Service Release 2 (4.4.2)
NDK 版本:android-ndk-r12b-windows-x86_64 (Native Development Kit)
ADT 版本 :Version: 23.0.4.1468518 (Android Development Toolkit)
二、使用第三方so库
1、环境配置
至于如何配置环境,这一步直接看《Android NDK入门之FirstJNI:Eclipse篇》
2、生成第三方so库(测试用)
如果你已经有了第三方库,那就忽略这部分。我这里生成so库是为了简单测试使用的。
A、新建一个生成so库的Android工程“JNISO”
随便创建一个Android工程即可,过程忽略
B、在项目中新增JNI相关文件
创建一个jni目录,然后新增如下文件
Android.mk
Application.mk
method.c
method.h
新增内容如下
1、Android.mk
# Android.mk 编程生成so
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := method
LOCAL_SRC_FILES := method.c
include $(BUILD_SHARED_LIBRARY)
2、Application.mk
# Aplication.mk 编译生成兼容各平台CPU的库,默认是生成所有的
APP_ABI := armeabi-v7a # 这里我们指定生成armeabi-v7a
还可以配置其他的,比如:armeabi,armeabi-v7a,x86,mips,arm64- v8a,mips64,x86_64
3、method.c
这里是函数功能的实现
#include "method.h"
/**
* 最大值
*/
int max(int x, int y) {
if (x > y) {
return x;
} else {
return y;
}
}
/**
* 最小值
*/
int min(int x, int y) {
if (x < y) {
return x;
} else {
return y;
}
}
4、method.h 头文件
#函数的预定义
int max(int x, int y);
int min(int x, int y);
C、编译生成so库
找到“JNISO”项目的路径,(WIN7系统)然后在JNISO的根目录运行“ndk-build”,如下:
E:\myworks\JNISO>ndk-build
[armeabi-v7a] Compile thumb : method <= method.c
[armeabi-v7a] SharedLibrary : libmethod.so
[armeabi-v7a] Install : libmethod.so => libs/armeabi-v7a/libmethod.so
由上面几步,我们就可以得到生成的so库文件
2、使用(引入)第三方so库
为了区别上面,因此我们这了再新建一个Android工程“FirstJNISO”,然后按照《Android NDK入门之FirstJNI:Eclipse篇》步骤完成。(这一步很重要,重要的是说三遍)
由于公司代码加密,无法分享压缩包文件。如果这一步不懂的可以留言。
如果你按照了《Android NDK入门之FirstJNI:Eclipse篇》完成了,我们就在其基础上引入第三方搜库。
新增的jni目录结构图:
jni
Android.mk
Application.mk #指定编译cpu平台,默认是全部编译
FirstJNISO.c #c文件
lib
libmethod.so #第三方so库
include
method.h #第三方库的头文件
在“FirstJNISO”工程中的jni目录中新增lib目录,然后再在lib目录中新增include目录
我们把上面生成的第三方so库“libmethod.so”拷贝到lib目录中,同时把method.h拷贝到lib/include目录中。
同时我们把Application.mk文件也拷贝过来(如果没有,会生成各平台CPU的库,但我们之引入armeabi-v7a库,因此会报错的)
然后修改Android.mk配置如下:
LOCAL_PATH := $(call my-dir)
#编译第三方so
include $(CLEAR_VARS)
LOCAL_MODULE := method
LOCAL_SRC_FILES := lib/libmethod.so
#申明第三方头文件路径
LOCAL_EXPORT_C_INCLUDES := lib/include
include $(PREBUILT_SHARED_LIBRARY)
#编译自己的so
include $(CLEAR_VARS)
LOCAL_MODULE := FirstJNISO
LOCAL_SRC_FILES := FirstJNISO.c
#这里引入第三方编译模块
LOCAL_SHARED_LIBRARIES := method
include $(BUILD_SHARED_LIBRARY)
FirstJNISO.c中使用第三方函数,修改内容如下:
#include <jni.h>
#include "lib/include/method.h"
jint Java_com_la_firstjniso_MainActivity_max(JNIEnv* env, jobject thiz, jint x,
jint y) {
return max(x, y);
}
jint Java_com_la_firstjniso_MainActivity_min(JNIEnv* env, jobject thiz, jint x,
jint y) {
return min(x, y);
}
PS:红色字体都是新增的
然后编译即可。
这个一定要在上一篇文章的继承上实现的,谢谢。如有问题,请指正。