知识点整理

  • 1.安装ndk
  • 2.android stuido ndk 配置
  • 3.编写代码
  • NDK常用编译参数
  • 4.运行


开发环境:windows10 ,android studio 3.5.2 ,Android.mk方式

1.安装ndk

方式1: https://developer.android.google.cn/ndk/downloads/ 下载下来,解压后,进行环境配置

方式2:android studio 自带下载

Android studio 配置maven android studio配置ndk_jni环境搭建


Android studio 配置maven android studio配置ndk_android_02

进行环境变量配置:

Android studio 配置maven android studio配置ndk_android_03

Android studio 配置maven android studio配置ndk_ndk_04

2.android stuido ndk 配置

1.在local.properties 中配置ndk 路径

Android studio 配置maven android studio配置ndk_jni_05

2.在gradle.properties 添加:

android.useDeprecateNdk=true

Android studio 配置maven android studio配置ndk_android_06


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

Android studio 配置maven android studio配置ndk_jni_07

3.编写代码

1.在com.example.Demo中创建myndk 这个类,通过在MainActivity 中点击button 来调用c/c++ 生成的so 库中的代码:

Android studio 配置maven android studio配置ndk_jni环境搭建_08

MainActivity.java:

package com.example.Demo;

import androidx.appcompat.app.AppCompatActivity;

import android.nfc.Tag;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    private TextView textView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView  = findViewById(R.id.tx);
        Log.d("main","onCreate");
    }
    public void onClick(View view) {   //Buttton 点击会调用
        myndk myndk = new myndk();
        int x = myndk.getint();
        Log.d("main","-----------------: "+x);
        textView.setText(String.valueOf(x));
    }
}

myndk.java

package com.example.Demo;

import android.util.Log;

public class myndk {
    static {
        Log.d("main","static  static  static  static  static  static");
        System.loadLibrary("MyLibrary");
    }
    public  native int getint();
}

JNI分为静态加载和动态加载:
静态加载需要单独生成.h 文件
动态加载不需要手动生成.h 文件
这里先介绍静态加载方式和手动生成 .so 库方式

(1)两个文件编写完成后,在myndk.java 目录下执行:

javac myndk.java

生成myndk.class 文件。
(2)在main/java 目录下执行:

javah -classpath . -jni com.example.Demo.myndk

自动生成 com_example_Demo_myndk.h

然后将com_example_Demo_myndk.h 移动到java/jni目录下

(3) 然后在jni 目录下创建 Android.mk Application.mk test.c 文件。

Android studio 配置maven android studio配置ndk_jni_09

Android.mk:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := MyLibrary
LOCAL_SRC_FILES =: test.c
include $(BUILD_SHARED_LIBRARY)

Application.mk:

APP_MODULES := MyLibrary
APP_ABI := all

test.c:

#include "com_example_Demo_myndk.h"
JNIEXPORT jint JNICALL Java_com_example_Demo_myndk_getint
  (JNIEnv * env, jobject obj){
   return 500;
  }

然后在jni 里面执行:

ndk-build NDK_PROJECT_PATH=. NDK_APPLICATION_MK=Application.mk APP_BUILD_SCRIPT=Android.mk NDK_LIBS_OUT=..\jniLibs\

会自动在jniLibs 里面生成不同平台的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

4.运行

Android studio 配置maven android studio配置ndk_android_10


效果:点击button 后,会调用native 方法,返回500 显示到textView上

Android studio 配置maven android studio配置ndk_ndk环境搭建_11

以上是手动配置生成.so 库,最后在将.so 库加载进apk 里面。