Android NDK 开发 - Cmake

本文详细介绍了JNI(Java Native Interface)的开发流程,从创建Java类、编写native方法开始,到使用javah生成头文件,再到C/C++源文件的编写与CMakeLists.txt的配置,最后完成so文件的生成与加载,全面解析了JNI开发的关键步骤。

JNI 开发步骤

  1. 创建 Java 类,编写 native 方法

    public class HelloJNI {
        public native String getContentFromJni();
    }
    
  2. Terminal 中切换到项目的 src/main/java 目录下,使用 javah 命令生成 jni 头文件

    E:\AndroidProject\ProgressAndroid\app\src\main\java>javah com.xing.progressandroid.jni.HelloJNI
    
  3. 在项目 app 目录右键 new -> Folder -> JNI folder 创建 C 或 C++ 目录,AndroidStudio 会生成一个 jni 目录,将 jni 头文件复制到 jni 目录中

  4. 在 jni 目录中创建与头文件同名的 C 或 C++ 源文件,实现 jni 头文件中声明的函数

    #include "com_xing_progressandroid_jni_HelloJNI.h"
    JNIEXPORT jstring JNICALL Java_com_xing_progressandroid_jni_HelloJNI_getContentFromJni
      (JNIEnv *env, jclass jclz) {
        return env->NewStringUTF("I'm from C++");
    }
    
  5. 在项目的 app 目录下创建 CMakeLists.txt 文件,编写内容:

    # cmake 最低版本
    cmake_minimum_required(VERSION 3.4.1)
    
    add_library( # Sets the name of the library.
    		# 设置生成的 so 动态库名字
            helloJni  
    
            # Sets the library as a shared library.
            SHARED
    
            # Provides a relative path to your source file(s).
            # 生成 so 文件的 C/C++ 文件	
            src/main/jni/com_xing_progressandroid_jni_HelloJNI.cpp)
    
    find_library( # Sets the name of the path variable.
            log-lib
    
            # Specifies the name of the NDK library that
            # you want CMake to locate.
            log)
    
    target_link_libraries( # Specifies the target library.
            helloJni
    
            # Links the target library to the log library
            # included in the NDK.
            ${log-lib})
    
  6. 在 build.gradle 文件中引用 CMakeLists.txt 文件

    android {
    	 defaultConfig {
             ndk {
                abiFilters "armeabi-v7a", "x86"    //设置生成的 so 支持的 cpu 类型
            }
    	 }
        .......
        externalNativeBuild {
            cmake {
                path "CMakeLists.txt"
            }
        }
    }
    
  7. make 编译工程,生成 so 文件

    在这里插入图片描述

  8. 加载 so 文件

public class JniTestActivity extends AppCompatActivity {

    static {
        System.loadLibrary("helloJni");   // so 文件名和 CMakeLists.txt 中指定的名字一致
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_jni_test);
        TextView textView = findViewById(R.id.tv_jni);
        HelloJNI helloJNI = new HelloJNI();
        textView.setText(helloJNI.getContentFromJni());
    }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值