NDK-Ndk-Build环境搭建
2021-7-31 zhuhongxi
一、安装ndk-build
1. 方式1: 单独下载ndk-build,并解压
地址:https://developer.android.google.cn/ndk/downloads/
2. 方式2:使用Android Studio下载

二、配置环境变量
我的ndk路径 C:\Users\zhuhongxi\AppData\Local\Android\Sdk\ndk\21.4.7075529
三、匹配Android Studio工程
1. 在project的local.properties 中配置ndk 路径
ndk.dir=C\:\\Users\\zhuhongxi\\AppData\\Local\\Android\\Sdk\\ndk\\你的版本

2. 在project的gradle.properties添加
android.useDeprecatedNdk=true

3. 在main 同级目录下创建jni和jniLibs 文件夹

4. 编写含native方法的java文件
这个native方法将会调用c/c++ 代码生成的so库中的方法实现。
package com.zhu.ndkbuilddemo;
public class NdkTest {
static {
System.loadLibrary("native-jni");
}
public native String getStringFromJni();
}
MainActivity.java中就用一个TextView测试它
package com.zhu.ndkbuilddemo;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView textView = findViewById(R.id.tv_info);
textView.setText(new NdkTest().getStringFromJni());
}
}
5. 用Jni的静态加载来测试,在Android Studio terminal执行
(1) 在NdkTest.java 目录下执行, 生成NdkTest.class
javac NdkTest.java
(2) 在main/ 目录下执行:
javah -d jni -classpath java -jni com.zhu.ndkbuilddemo.NdkTest
生成com_zhu_ndkbuilddemo_NdkClass.h,可以在jni目录下看到
javah命令中,
-d指定创建头文件的目标路径,.h的生成路径
-classpath指定类的路径,由于当前路径是main,所以指定其中的java即可。
-jni需要转化的类路径,包名+类名
(3) 然后在jni 目录下创建 Android.mk Application.mk test.c 文件。

- Application.mk
APP_MODULES := native-jni
APP_ABI := all
- Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := native-jni
LOCAL_SRC_FILES =: test.c
include $(BUILD_SHARED_LIBRARY)
- test.c
#include "com_zhu_ndkbuilddemo_NdkClass.h"
//这个函数名字和.h文件中的函数名保持一致
JNIEXPORT jstring JNICALL Java_com_zhu_ndkbuilddemo_NdkClass_getStringFromJni
(JNIEnv * env, jobject thiz){
return (*env)->NewStringUTF(env, "HELLO JNI");
}
- com_zhu_ndkbuilddemo_NdkClass.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_zhu_ndkbuilddemo_NdkClass */
#ifndef _Included_com_zhu_ndkbuilddemo_NdkClass
#define _Included_com_zhu_ndkbuilddemo_NdkClass
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_zhu_ndkbuilddemo_NdkClass
* Method: getStringFromJni
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_zhu_ndkbuilddemo_NdkClass_getStringFromJni
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
(4) 使用ndk-build工具中命令行中编译so
- 在Android Studio中的命令行中进入
jni目录执行:
ndk-build NDK_PROJECTPATH=. NDK_APPLICATION_MK=Application.mk NDK_BUILD_SCRIPT=Android.mk NDK_LIBS_OUT=..\jniLibs\
就会自动在jniLibs 里面生成不同平台的so 库, 这样app构建时也能找到这个so
运行工程到虚拟机验证下

补充: NDK常用编译参数
NDK_PROJECT_PATH
说明:指定工程目录
示例:ndkbuild NDK_PROJECT_PATH=C:\Hello
NDK_LIBS_OUT
说明:指定.so文件输出目录,默认值为"$(NDK_PROJECT_PATH)/libs"
示例:ndkbuild NDK_LIBS_OUT=C:\Hello\libs
NDK_APPLICATION_MK
说明:指定Application.mk文件路径,默认值为"$(NDK_PROJECT_PATH)/jni/Application.mk"
示例:ndkbuild NDK_APPLICATION_MK=C:\Hello\src\Application.mk
NDK_DEBUG
说明:打开或关闭调试模式,debug模式时会生成gdbserver等文件
示例:ndkbuild NDK_DEBUG=1
NDK_LOG
说明:显示内部NDK日志消息(用于调试NDK自身)
示例:ndkbuild NDK_LOG=1
NDK_HOST_32BIT
说明:Always use toolchain in 32-bit mode (see below).
示例:ndkbuild NDK_HOST_32BIT=1
APP_BUILD_SCRIPT
说明:指定Android.mk文件路径,默认值为"$(APP_PROJECT_PATH)/jni/Android.mk"
示例:ndkbuild APP_BUILD_SCRIPT=C:\Hello\src\Android.mk
Clear
说明:清除所有生成的二进制文件
示例:ndkbuild Clear
-B
说明:强制完全重新构建
示例:ndkbuild -B
-C <project>
说明:构建位于<工程目录>的工程的本地代码。当你不想在终端上用cd切换到那个目录时有用
示例:ndkbuild -C C:\Hello
V
说明:打开或关闭显示编译参数
示例:ndkbuild V=1
版权声明:本文为qq_40731414原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。