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包。