本来想学习下openGL ES,在网上搜教程,又想下载写源码看看,然后在github上下载了些相关的代码,下载后,因为cMake的版本不兼容原因总是编译不通过,那就学一下cMake是啥吧,搜着搜着就搜到了这个视频
教学视频还不错,自己跟着写个demo,还真调通了,有种瓜得豆的感觉,特此记录下,等记录完,我就继续学openGL ES去了
1. NDK 工程的建立
首先新建一个android的demo,在build.gradle(:app)下的android{}里增加
externalNativeBuild {
cmake {
path file('../../MMPlayer/CMakeLists.txt')
}
}
如图
CMakeLists是顶层 CMake 项目文件,在此处执行全局配置
c++的项目与android的文件夹是同级的
最后,还需要下载NDK
2. JNI的基本用法
-
在Java中定义时,需要在函数名前增加native关键字
-
如果c++定义的是动态库,则需要提前加载
终端在app/src/main/java文件路径下,执行
javac -h ./ com/example/androidjnidemo/MMPlayerJNI.java
可以得到对应的".h"文件
文件名为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文件夹下
最后将C++代码贴出
- c++项目根目录下的CMakeLists.txt
# CMakeList.txt 顶层 CMake 项目文件,在此处执行全局配置
# 并包含子项目
cMake_minimum_required(VERSION 3.8)
project("MMPlayer")
# 包含子项目
add_subdirectory("MMPlayerJNI")
- c++项目MMPlayerJNI文件夹下的CMakeLists.txt
# CMakeList.txt 顶层 CMake 项目文件,在此处执行全局配置
# 并包含子项目
cMake_minimum_required(VERSION 3.8)
add_library(
MMPlayerJNI
SHARED
MMPlayerJNI.cpp
)
- 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;
}
如果运行不起来,再参考下上面的视频就可以了