[NDK]-搭建ndk-build环境

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

二、配置环境变量

我的ndk路径 C:\Users\zhuhongxi\AppData\Local\Android\Sdk\ndk\21.4.7075529
在这里插入图片描述

三、匹配Android Studio工程
1. 在projectlocal.properties 中配置ndk 路径
ndk.dir=C\:\\Users\\zhuhongxi\\AppData\\Local\\Android\\Sdk\\ndk\\你的版本

在这里插入图片描述

2. 在projectgradle.properties添加
android.useDeprecatedNdk=true

在这里插入图片描述

3. 在main 同级目录下创建jnijniLibs 文件夹

在这里插入图片描述

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

坂田民工

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值