android studio 3.6.3 ndk开发-cpp文件中加载第三方.so库并生成新.so文件(一)

背景:再工作过程中需要ndk开发,并且再ndk工程的cpp文件中加载另一个第三方.so库同时生成自己得.so文件供他人或其他应用调用。

参考:https://blog.csdn.net/zuguorui/article/details/96464821
一、编写so库代码
编写.c文件。例如:algo.cpp

//Algo.cpp

#include "algo.h"

algo::algo()
{

}

algo::~algo()
{

}

int algo::add(int a,int b)
{
    return a + b;
}

int algo::sub(int a, int b)
{
    return a - b;
}

int algo::mul(int a,int b)
{
    return a *b;
}

int algo::div(int a, int b)
{
    return a/b;
}

编写.h文件。例如algo.h

//Algo.h
class algo
{
public:
    algo();
    ~algo();
    int add(int a,int b);  //加
    int sub(int a,int b);  //减
    int mul(int a,int b);  //乘
    int div(int a,int b);  //除
};

在电脑任意一个系统文件新建一个文件夹(例如在桌面新建algo文件夹),并在此文件夹新建so文件夹,将以上.cpp及.h文件放到so文件夹内。文件结构如下:
在这里插入图片描述
二、使用ndk-build工具生成so文件
1、配置ndk-build
安卓过Android studio软件,并且该软件配置过ndk环境,在Android sdk目录下都会有ndk文件夹,并且该文件夹下面包含ndk-build工具。现在就使用该工具将cpp代码编译生成.so动态库供其他apk使用。
android studio3.6.3 ndk环境配置方法:
https://blog.csdn.net/zhuowalun8427/article/details/105970017
我的ndk-build路径:
在这里插入图片描述
将ndk-build路径设置到系统环境变量(感觉不设置也可以)。
我得路径:E:\install\android-sdk\ndk\21.1.6352462
在这里插入图片描述
2、编译so文件
到此可以编译so库了。依据NDK官方文档,目前有三种方式可以编译C/C++项目:Android.mk和Application.mk、makefile、gradle。但是如果仅使用NDK手动编译,就必须选择第一种方式,因此这一步我们需要首先编辑Android.mk和Application.mk文件。
编辑android.mk
这个文件的详细信息可参阅NDK官方文档-Android.mk。简要地说,这个文件相当于对工程的配置,比如要编译的源码文件、编译的模块名称等。
新建一个Android.mk文件到so目录下,内容如下:

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional

# 需要编译出的so的模块名
LOCAL_MODULE:= libalgo

# All of the source files that we will compile.
LOCAL_SRC_FILES:= \
	algo.cpp

LOCAL_C_INCLUDES += \
    $(LOCAL_PATH)/algo.h \
    

include $(BUILD_SHARED_LIBRARY)

编辑Application.mk
这个文件的详细信息可参考NDK官方文档-Application.mk。它指定了编译的一些参数以及模块配置。
同样位置在so目录下,内容如下:

APP_ABI := all
APP_OPTIM := release
APP_STL := c++_static
APP_CPPFLAGS := -frtti -fexceptions
APP_MODULES := libalgo
APP_BUILD_SCRIPT := Android.mk

要注意的是APP_BUILD_SCRIPT := Android.mk这一句,它指定了我们Android.mk的位置,Application.mk和Android.mk都在同级目录下,可以直接这样写。如果你的目录有差别,注意改这一句,规则和Linux下文件路径规则是一致的。
最后的目录是这样的。
在这里插入图片描述
3)编译
接下来,把终端切换到so目录下。由于NDK有一套默认的Application.mk和路径,因此如果要它适应我们自己的目录结构,就要自己设置我们的工程目录并且为它指明Applicatiom.mk,当如果没有设置,直接输ndk-build,它会提示你。
在这里插入图片描述
它提示找不到工程目录,需要定义一个NDK_PROJECT_PATH变量。
输入下面的命令来临时添加这个变量,目录位置就是so目录,由于我现在终端位置就在so目录里,因此直接用./即可。SET NDK_PROJECT_PATH=./
在这里插入图片描述
再输入ndk-build,它会提示找不到Android.mk文件,实际上NDK有一个自己的Application.mk文件,但是它并没有指向我们自己的Android.mk文件。
在这里插入图片描述
输入以下命令来为它指明我们的Application.mk文件。
ndk-build NDK_APPLICATION_MK=./Application.mk
在这里插入图片描述
注意的是,这个命令同时也会开始进行编译。终端里一堆输出。
在这里插入图片描述
如果没有错的话,会在so目录下生成libs和obj这两个文件夹,在libs目录下就有我们需要的so库,由于我在Application.mk文件中ABI指定为all,因此现在最常用的arm和x86的32位、64位库都会被编译出来。
编译成功的目录如下:
在这里插入图片描述
在这里插入图片描述
四个平台每个平台有对应的.so文件。
注意:最后一步ndk-build NDK_APPLICATION_MK=./Application.mk命令,要保证.cpp和.h文件是正确的,并且是可以编译的。这个就要使用c语言编译环境自行调试。如果这两个文件有错误,不会进行编译,执行该命令报错如下(我自己的报错是这样,可能错误不同,报的不一样把)
在这里插入图片描述
到此,.so文件生成成功。该文件准备在Android studio中新建ndk工程,在cpp中被调用。这部分内容下一篇写吧,要不太长了。
下篇链接:https://blog.csdn.net/zhuowalun8427/article/details/114294901

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值