Android NDK、JNI之--(四)so打包发布aar

一、前言

突然好久发现没写JNI相关的代码了,也不清除现在的一个流程了,所以今天特地重新尝试了下so文件的开发以及打包发布aar等流程。

二、 真香的Android Studio

现在AS已经发展到了3.6.3的版本了,我们可以直接新建一个使用JNI的Native C++示例工程,如下图最后一个Native C++的工程模板,一路Next,Finish下去即可创建好该工程了。
在这里插入图片描述
新建的工程跟之前的区别不是很大,在main下多了一个 cpp 的文件夹,专门用来存放 .cpp代码 以及 CMakeLists.txt文件
直接运行就能看到效果了,但是由于我们要打aar的包,所以我们新建module来做。

三、新建hello Module

直接新建Android Library Module,新建完后我们仿照工程中app module的示例代码来完善。

3.1、新建cpp文件夹

在hello module的main文件夹下创建cpp文件夹,这个文件夹中需要包含CMakeLists.txt和.cpp的源码文件,然后我们来完善这个文件夹。

3.1.1、新建CMakeLists.txt文件

我们仿照app module中编写CMakeLists.txt文件:

cmake_minimum_required(VERSION 3.4.1)

add_library( # Sets the name of the library.
		#注意这里的library name,下文在java(kotlin)类中需要用到
        hello-lib 

        # Sets the library as a shared library.
        SHARED

        # Provides a relative path to your source file(s).
        hello.cpp) #注意是路径,而不是包,不可用.区分,需要使用/

find_library( # Sets the name of the path variable.
        log-lib

        # Specifies the name of the NDK library that
        # you want CMake to locate.
        log)

target_link_libraries( # Specifies the target library.
        hello-lib

        # Links the target library to the log library
        # included in the NDK.
        ${log-lib})

可以看到我们在该文件中配置了生成的library名称为:hello-lib,而使用的代码文件是hello.cpp文件。

3.1.2、新建hello.cpp文件

好了接下来新建.cpp文件,里面是一个示例的hi()方法【为啥要加这个方法进去?因为我在新的module中创建java或者kotlin类后,在类中新建本地方法,结果发现快捷键无法直接生成对应的c++方法。但是只要这个cpp文件有任意一个方法后,在本地方法上使用快捷键就可以直接生成了】:

#include <jni.h>
#include <string>

extern "C"
JNIEXPORT void JNICALL
Java_xxx_hi(JNIEnv *env, jobject thiz) {
    // TODO: implement hi()
}

3.2、配置build.gradle

打开hello Module下的build.gradle文件,我们仿照app中的进行修改,其实就两处:

  • android 节点下添加externalNativeBuild 配置path及version等信息
  • android defaultConfig 节点下添加externalNativeBuild 配置cppFlags等信息

修改完毕后重新构建下项目:

android {
		......
		defaultConfig{
				......
				externalNativeBuild {
            		cmake {
                		cppFlags ""
            		}
        		}
		}

		externalNativeBuild {
       		cmake {
            		path "src/main/cpp/CMakeLists.txt" //这里就是上文我们在module中编写的hello CMakeLists.txt文件
            		version "3.10.2"
        	}
    }
}

3.3、新建本地方法

在hello Module中java文件夹下的包中新建showHello类(kotlin示例)如下:

class ShowHello {

    companion object {
        init {
            System.loadLibrary("hello-lib")
        }
    }

    external fun getHello(): String
}

伴生对象init{}代码块中的就是我们需要加载的library名称,需要和你在CMakeLists.txt中定义Library 名称的一致。
然后我们写本地方法getHello(),此时在getHello()方法上使用快捷键 Alt+Enter ,弹出如下所示:
在这里插入图片描述
回车后即可在上文的hello.cpp文件中看到生成的代码了,但是如果在上文.cpp文件中没有配置默认方法的话,这一步就废了无法帮助我们自动生成:

然后记得将生成的代码中的TODO完善,下文中我们就让其返回了一个默认的字符串:

#include <jni.h>
#include <string>

extern "C"
JNIEXPORT void JNICALL
Java_xxx_hi(JNIEnv *env, jobject thiz) {
    // TODO: implement hi()
}
extern "C"
JNIEXPORT jstring JNICALL
Java_com_cooloongwu_hello_ShowHello_getHello(JNIEnv *env, jobject thiz) {
    // TODO: implement getHello()
    return env->NewStringUTF("This is a String from hello module, hello.cpp");
}

3.4、测试本地方法

让app module直接依赖hello module,然后在MainActivity中直接打印该方法即可,例如最简单的:

Log.e("本地方法测试", ShowHello().getHello())

不出意外的话,可以直接在控制台打印出来信息了,好的,快进。

四、将hello module打包aar

打包的话其实很简单了,打开AS右侧的Gradle,在hello module下点击Tasks->other->assembleRelease,等待AS构建完即可在 hello模块下的build/outputs/aar文件夹下看到生成的hello-release.aar文件了。
将该文件拷贝出来,我们解压看看里面内容如下,生成的so文件其实在jni目录下:
在这里插入图片描述

五、其他工程使用aar

新建其他Android工程,然后我们直接将上文生成的 hello-release.aar包拷贝到新工程app module的libs目录下,然后更改app module下的build.gradle文件,添加对该aar包的依赖:

dependencies {
	...
	implementation files('libs/hello-release.aar')
}

然后构建项目。
构建完毕后直接在MainActivity中日志打印调用aar中的ShowHello类的getHello()方法即可测试。

六、总结

好了,整个打包及使用的过程到这里就结束了。但是每次这样打包下发给其他人去更新去使用的话是不是很麻烦呢,而且也没有个版本号信息什么的,不方便查阅。所以我们可不可以发布这个aar包到公司构件仓库中,然后配置依赖去使用呢,当然可以哈哈。如果对构件仓库还不熟悉的请参考 AndroidStudio加速之–构件仓库Artifactory 这篇文章,下文我们就将aar发布到Artifactory中。

最后说下,我最近写的一些文章知识点基本快串联起来了。下面是相关的文章:
AndroidStudio加速之–(一)构件仓库Artifactory
Android NDK、JNI之–(四)so打包发布aar
AndroidStudio加速之–(三)发布aar到Artifactory
Android 编译插桩之–自定义Gradle插件

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: android-ndk-r12b-windows-x86.zip 是一个 Android NDK 的压缩文件Android NDK (Native Development Kit) 是一个让开发者能够使用 C 或 C++ 程序语言编写 Android 应用的工具集合。它主要用于开发需要高性能或使用底层库的应用程序。 android-ndk-r12b-windows-x86.zip 针对的是 Windows 系统的 32 位操作系统。该文件包含了 Android NDK 的相关文件和工具,可供开发者使用。开发者可以通过下载该文件,解压缩并配置环境变量,以便在 Windows 上编写和构建 C/C++ 代码的 Android 应用程序。 该压缩文件中包含了编译器、调试器、标准系统库、头文件以及其他构建和调试所需的文件。通过使用该工具集合,开发者可以充分利用 C/C++ 语言的速度和功能,编写高性能、复杂的 Android 应用程序。 同时需要注意的是,该压缩文件适用于 Windows 系统的 32 位操作系统。如果你的设备或操作系统是其他类型的,可能需要下载适用于该设备或操作系统的相应版本。 ### 回答2: android-ndk-r12b-windows-x86.zip 是一个Android NDK(Native Development Kit)的压缩文件NDK是一个用于开发Android平台上原生代码的工具集。它允许开发者在Java平台上编写Android应用程序的同时,通过使用C或C++等编程语言编写高性能和复杂度较高的代码模块。NDK通过将应用程序的代码编译为与硬件平台相关的机器码实现高效执行。 android-ndk-r12b-windows-x86.zip 这个文件是适用于Windows操作系统的NDK的压缩文件,特定于x86架构。这意味着该NDK版本适用于基于x86架构的32位执行环境,例如32位的Windows操作系统。 该压缩文件包含了开发者在Windows系统上使用NDK所需的所有文件和工具,如编译器、调试器、库文件等。开发者可以使用这个NDK版本来编写和构建在x86架构上运行的Android应用程序。 通过使用NDK,开发者可以利用C或C++编写更高效和功能强大的代码,也可以重用已有的C/C++代码库。这对于需要执行高计算密集型任务、需要访问底层硬件功能或需要与跨平台C/C++库集成的应用程序非常有用。 总之,android-ndk-r12b-windows-x86.zip 是一个适用于Windows操作系统的Android NDK的压缩文件,特定于x86架构。使用这个NDK版本,开发者可以编写高性能、复杂度较高的代码以实现更强大的Android应用程序。 ### 回答3: android-ndk-r12b-windows-x86.zip是一个用于Windows操作系统的Android NDK(Native Development Kit)软件包。Android NDK是一个开发工具集,可以帮助开发人员使用C和C++语言编写Android应用程序。它提供了一组库和工具,允许开发者直接使用本地代码进行开发。 android-ndk-r12b-windows-x86.zip包含了NDK的安装程序和相关的文件。用户可以通过解压缩这个压缩包来安装NDK。一旦安装完成,开发者就可以在Windows操作系统上使用NDK来开发Android应用程序。这个特定的压缩包适用于x86架构的计算机,这是一种常见的Windows计算机架构。 使用android-ndk-r12b-windows-x86.zip,开发者可以利用NDK的功能来更好地优化他们的Android应用程序。这包括直接使用本机代码编写应用程序的能力,以及访问底层系统功能的能力。通过使用NDK,开发者可以在性能关键的部分使用底层代码,提高应用程序的速度和效率。 android-ndk-r12b-windows-x86.zip是一个方便开发者使用Android NDK的软件包。它使开发者能够充分利用底层功能,并开发出更高效的Android应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值