接上一篇,上一篇主要是讲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:红色字体都是新增的

然后编译即可。

这个一定要在上一篇文章的继承上实现的,谢谢。如有问题,请指正。

相关文章

暂无评论

none
暂无评论...