NDK 是 Android 所提供的一个开发工具集,通过 NDK 可以在 Android 中更加方便的通过 JNI 来访问本地代码,比如 C 或者 C++。

NDK 示例

  • 创建 Android 工程,工程名为 HelloNDK。

  • 在 MainActivity 中声明 native 方法

    public static native String getStringFromC();

  • 通过 javah 命令生成头文件
    Mac Android studio NDK 开发
    javah 生成 Java 类对应的头文件必须要用到 javah 命令。
    -d 表示生成一个目录。
    …/jni 表示在当前目录的上一层目录,当前在Java目录下,那么它的上层目录就是 main 目录。
    com.example.hellondk.MainActivity 完整类名

  • 实现 JNI 方法,在 jni 目录下创建 hello.c 文件,代码如下。

#include<stdio.h>
#include<stdlib.h>
#include "com_example_hellondk_MainActivity.h"

/**
 * JNIEnv*  表示一个指向 JNI 环境的指针,可以通过它来访问 JNI 提供的借口方法
 * JNIEXPORT  JNICALL 是 JNI 所定义的宏,可以在 jni.h 头文件中找到
 */
 
JNIEXPORT jstring JNICALL Java_com_example_hellondk_MainActivity_getStringFromC(JNIEnv *env,jclass jclass){
    return (*env) -> NewStringUTF(env,"Hello from JNI");
}
LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE     := hello        //模块名称,需要加载的 so 库文件 
LOCAL_SRC_FILES  := hello.c      //需要参与编译的源文件

include $(BUILD_SHARED_LIBRARY)
  • 可以通过 ndk-build 命令编译产生 so 库,也可以让 AndroidStudio 自动编译 JNI 生成,采用自动编译的方法。
    1. 在 gradle.properties 文件中最后一行添加代码 andorid.useDeprecatedNdk=true
    2. 在 app 目录下 build.gradle 文件中添加代码如下
    defaultConfig {
          applicationId "com.example.hellondk"
          minSdkVersion 15
          targetSdkVersion 28
          versionCode 1
          versionName "1.0"
          testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    
          ndk{
              moduleName "hello"    //指定打包后的 so 库文件名
              abiFilters "armeabi-v7a","x86"   //指定某个 CPU 平台的 so 库
          }
      }
    
  • 最后一步加载 so 库文件,并调用方法测试。
public class MainActivity extends AppCompatActivity {

    static {
        System.loadLibrary("hello");
    }
    public static native String getStringFromC();
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView textView = findViewById(R.id.textView);
        textView.setText(getStringFromC());
    }
}

相关文章:

  • 2021-08-21
  • 2022-01-18
  • 2021-11-17
  • 2021-12-10
  • 2021-06-06
  • 2021-04-05
  • 2021-08-30
猜你喜欢
  • 2022-03-06
  • 2022-12-23
  • 2021-07-08
  • 2021-05-18
  • 2022-01-08
  • 2021-08-10
  • 2021-05-28
相关资源
相似解决方案