赞
踩
背景:再工作过程中需要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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。