NDK之使用第三方so库

Android  2018年9月19日 am8:37发布6年前 (2018)更新 城堡大人
78 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、 本站名称: 笔友城堡
2、 本站网址: https://www.biumall.com/
3、 本站部分文章来源于网络,仅供学习与参考,如有侵权,请留言

暂无评论

暂无评论...

随机推荐

许立志:行走的肉体

撕开这些枯萎的花朵,垂死的帷幕被风干的命运,喑哑的厂房韶华失色,螺丝拧紧他怯弱的骨头关节,尖锐的疼痛破裂,你深为了解的封闭油腻的齿轮,咬啮辗压红色的童年,一如火车日夜辗压铁轨,呼啸漂泊的流浪间雨又落下,纠缠喧哗的爱情,梦想我看到自己的幸运或者不幸熔进了发展中的工业废水饱蘸叹息的...

bat脚本命令简介

批处理,也称为批处理脚本,英文译为BATCH,批处理文件后缀BAT就取的前三个字母。它的构成没有固定格式,只要遵守以下这条就ok了:每一行可视为一个命令,每个命令里可以含多条子命令,从第一行开始执行,直到最后一行结束,它运行的平台是DOS。批处理有一个很鲜明的特点:使用方便、灵活,功能强大,自动化程...

window bat脚本自动开关WiFi

前面我们已经学习了bat脚本命令的基础命令的使用,今天我们就学习学习一个简单又使用的(对我而言)实例。使用bat控制自动化测试WiFi开和关的性能。(本文需要《adb shell命令控制WIFI连接开启/关闭状态》知识)先直接上代码,然后慢慢分析。@echo off:startech...

获取Android设备的分辨率各种方式

前言有时候需要查看Android设备的分辨率,由于不同的Android版本,使用的方式存不同,因此这里记录一下常用的方式。总结下面三种方式都可以,但个人还是热衷于使用adb,只要连接上设备就可以获取。如果不是Android 4.2.2 环境 我就用:adb shell wm size...

朱光潜:读书不在多,在于选得精,读得彻底

十几年前我曾经写过一篇短文谈读书,这问题实在是谈不尽,而且这些年来我的见解也有些变迁,现在再就这问题谈一回,趁便把上次谈学问有未尽的话略加补充。学问不只是读书,而读书究竟是学问的一个重要途径。因为学问不仅是个人的事而是全人类的事,每科学问到了现在的阶段,是全人类分途努力日积月累所得到的成就,而这成...

刘继荣:不想当英雄,只想做那个坐在路边为英雄鼓掌的人

23号女儿女儿在班上,同学都管她叫23号。她班上总共有50个人,而每次考试,女儿都排名23。久而久之,便有了这个雅号,她也就成了名副其实的中等生。我们觉得这外号刺耳,女儿却欣然接受。老公发愁地说,一碰到公司活动,或者老同学聚会,别人都对自家的“小超人”赞不绝口,他却只能扮深沉。人家的孩子,不仅...