Android NDK工程的建立 和 JNI的基本用法

1,123 阅读2分钟

本来想学习下openGL ES,在网上搜教程,又想下载写源码看看,然后在github上下载了些相关的代码,下载后,因为cMake的版本不兼容原因总是编译不通过,那就学一下cMake是啥吧,搜着搜着就搜到了这个视频

Android NDK 工程的建立和 JNI 的基本用法

教学视频还不错,自己跟着写个demo,还真调通了,有种瓜得豆的感觉,特此记录下,等记录完,我就继续学openGL ES去了

1. NDK 工程的建立

首先新建一个android的demo,在build.gradle(:app)下的android{}里增加

externalNativeBuild {
    cmake {
        path file('../../MMPlayer/CMakeLists.txt')
    }
}

如图

image.png

CMakeLists是顶层 CMake 项目文件,在此处执行全局配置

image.png

c++的项目与android的文件夹是同级的

最后,还需要下载NDK

image.png

2. JNI的基本用法

  1. 在Java中定义时,需要在函数名前增加native关键字

  2. 如果c++定义的是动态库,则需要提前加载

image.png

终端在app/src/main/java文件路径下,执行

javac -h ./ com/example/androidjnidemo/MMPlayerJNI.java

可以得到对应的".h"文件

image.png

文件名为com_example_androidjnidemo_MMPlayerJNI.h,文件内容为

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_androidjnidemo_MMPlayerJNI */

#ifndef _Included_com_example_androidjnidemo_MMPlayerJNI
#define _Included_com_example_androidjnidemo_MMPlayerJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_example_androidjnidemo_MMPlayerJNI
 * Method:    add
 * Signature: (II)I
 */
JNIEXPORT jint JNICALL Java_com_example_androidjnidemo_MMPlayerJNI_add
  (JNIEnv *, jclass, jint, jint);

#ifdef __cplusplus
}
#endif
#endif

将该文件剪切至C++项目的MMPlayerJNI文件夹下

image.png

最后将C++代码贴出

  1. c++项目根目录下的CMakeLists.txt
# CMakeList.txt 顶层 CMake 项目文件,在此处执行全局配置
# 并包含子项目
cMake_minimum_required(VERSION 3.8)

project("MMPlayer")

# 包含子项目
add_subdirectory("MMPlayerJNI")
  1. c++项目MMPlayerJNI文件夹下的CMakeLists.txt
# CMakeList.txt 顶层 CMake 项目文件,在此处执行全局配置
# 并包含子项目
cMake_minimum_required(VERSION 3.8)

add_library(
   MMPlayerJNI
   SHARED
   MMPlayerJNI.cpp
)
  1. c++项目MMPlayerJNI文件夹下的MMPlayerJNI.cpp
#include "com_example_androidjnidemo_MMPlayerJNI.h"

JNIEXPORT jint JNICALL Java_com_example_androidjnidemo_MMPlayerJNI_add
(JNIEnv *, jclass, jint a, jint b)
{
   return a + b;
}

如果运行不起来,再参考下上面的视频就可以了