NDK之使用第三方so库

Android  2018年9月19日 am8:37发布6年前 (2018)更新 91es.com站长
68 0 0


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

然后编译即可。

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

 历史上的今天

  1. 2022: Android Studio混淆aar包记录(0条评论)
  2. 2021: 麦芒:今夜的火花今夜就会熄灭(0条评论)
  3. 2019: 龙应台:明白(0条评论)
版权声明 1、 本站名称: 91易搜
2、 本站网址: 91es.com
3、 本站内容: 部分来源于网络,仅供学习和参考,若侵权请留言
3、 本站申明: 个人流水账日记,内容并不保证有效

暂无评论

暂无评论...

随机推荐

ViewPager出现pointerIndex out of range

前言ViewPager展示图片时,对图片操作时出现如下异常AndroidRuntime: FATAL EXCEPTION: mainAndroidRuntime: Process: com.biumall.image, PID: 17729AndroidRuntime: java.lang...

[摘]《财富》杂志评选:75本商业必读书

《财富》杂志曾调动一切资源,选出了有史以来最应该阅读的75本商业必读书。这些书将激发你的思考,甚至是行动。实际上,有了这份书单,你等于就有了睿智的顾问供你驱使,它耐心地待在那里,等着你的召唤。商业兴衰No.1 《1929年大崩盘》约翰·肯尼斯·加尔布雷思(著)这是本简明扼要但又富有见地的历史...

MediaScanner源码JNI介绍

前言之前介绍MediaScanner源码时就知道这里用了JNI,学习完JNI后重跟一下MediaScanner的代码。记录一下本地方法的使用和调用Java方法,记录于此,方便自己查阅和复现。正文涉及文件或目录frameworks\base\media\java\android\media\...

Android添加保护广播protected-broadcast

前言monkey测试时,在Android原生设置点击多用户,也就是新创建了用户,导致system进程发送的无法接受到。03-30 09:35:31.829 3827 4459 E ActivityManager: Sending non-protected broadcast droi...

MySQL中like查询的简单使用

前言在数据库中,like关键字用于搜索匹配字段中的指定内容。本文就摘抄于网上的内容,整理于此,方便自己查阅。正文like语法[not] like '字符串'not:可选参数,字段中的内容与指定字符串不匹配时满足条件字符串 :指定用来匹配的字符串,可以是完整的字符串(完整匹配),也...

framework中添加自己的aidl

前言简单记录一下在Framework中新增一个服务接口,方便应用调用,类似于获取AudioManager一样。AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);Android...