NDK:一步步编译Android so包

1.环境搭建

本教程基于AS3.4.2的,目前稳定版最新的。需要下载LLDB,NDK,CMake就行,下载完后as自动配置,所以比较简单,只需要把上面几个选线勾选上,单击apply即可。
在这里插入图片描述

2 开始

2.1 创建项目工程

这个比较简单,只需要创建一个空白的项目工程即可,要确保它是可以正常运行。

2.2 准备工作

  • 创建一个纯java类,Test.java
public class Test {
    static {
        System.loadLibrary("MyJni");//加载so的名称
    }
    public native static String get();//方法
}

static块是加载so包的,不用加后缀名。

这个Java类中的方法和c语言的方法是一一对应的,切勿写错了。把这个文件用java命令javac编译成 .class 文件,这就需要使用javac命令来实现。

  • 生成 .class 文件
javac java路径
// 如:javac E:\AndroidProjects\SoPackageTest\app\src\main\java\com\haochen\sopackagetest\Test.java

执行完后在同样的目录下出现一个.class 文件。(其实这一步也可以不单独做,在获取头文件时,会自动编译的)

  • 生产 .h 头文件
    打开Android studio 下的terminal 控制台,通过命令切换到main目录下。
    然后执行生成头文件命令:
    javac  -encoding  utf8  -h .\jni  path
//javac命令 编码			  头文件 保存路劲 编译路劲
//如:javac -encoding utf8 -h .\jni E:\AndroidProjects\SoPackageTest\app\src\main\java\com\haochen\sopackagetest\Test.java

执行成功后,在jni目录下会看到 .h 文件(名字是自己命名好的)

2.3 编写 .c 文件

  • 新建 .c 文件
    在Android studio 新建一个 .c 文件,如下图,但是目录一定要在jni目录下,和 .h 放在一起。
    在这里插入图片描述
  • 码程序
#include<jni.h>
#include<stdio.h>
#include "com_haochen_sopackagetest_Test.h"

JNIEXPORT jstring JNICALL Java_com_haochen_sopackagetest_Test_get
(JNIEnv *env, jclass jclass) {
    return (*env)->NewStringUTF(env, "This is my first NDK Application,my name is navy");
}

具体里面为什么这么写,这就涉及到NDK语法了。

  • .mk 文件
    这个文件目的是配置编译路劲。
LOCAL_PATH :=$(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE := MyJni //so的名称,必须要和配置文件以及类中名称要一致。
LOCAL_LDFLAGS := -Wl

LOCAL_SRC_FILES := E:\AndroidProjects\SoPackageTest\app\src\main\jni\My.c// c 文件路劲

LOCAL_C_INCLUDES += E:\AndroidProjects\SoPackageTest\app\src\main\jni //include 文件

include $(BUILD_SHARED_LIBRARY)

右击Android.mk->Link C++ Project with Gradle ,弹出Link C++ Project with Gradle 对话框,选择 ndk-build 以及 Android.mk 路径,点击OK

  • 配置build.gradle
    在Android defaultconfig设置如下
ndk {
            moduleName "MyJni"//so名称
            abiFilters 'arm64-v8a'//支持的so包的格式
    }

在Android 下设置:

externalNativeBuild {
        ndkBuild {
            path file('src/main/jni/Android.mk')
        }
    }

到此,配置算是完成,执行程序成功后,我们就能在下面目录中找到so包。
在这里插入图片描述

值得注意的是:包名的要一致

编译好的so可以拷到不同项目中用,若是需要不同平台的so,只需要在build.gradle 中的ndk选项中设置不同平台,编译成功后,会有不同平台的so包。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

技术人Howzit

钱不钱的无所谓,这是一种鼓励!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值