打印日志
#include "android/log.h"
#ifndef _ANDROID_LOG_TAG_
#define _ANDROID_LOG_TAG_
#define DEBUG //定义了这个,才打印日志
#define TAG "ndk-jni" // 这个是自定义的LOG的标识
#ifdef DEBUG
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,TAG ,__VA_ARGS__) // 定义LOGD类型
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,TAG ,__VA_ARGS__) // 定义LOGI类型
#define LOGW(...) __android_log_print(ANDROID_LOG_WARN,TAG ,__VA_ARGS__) // 定义LOGW类型
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR,TAG ,__VA_ARGS__) // 定义LOGE类型
#define LOGF(...) __android_log_print(ANDROID_LOG_FATAL,TAG ,__VA_ARGS__) // 定义LOGF类型
#else
#define LOGD(...) NULL
#define LOGI(...) NULL
#define LOGW(...) NULL
#define LOGE(...) NULL
#define LOGF(...) NULL
#endif
#endif
//使用起来,完全类似print函数
LOGD("type = %d", type);
生成头文件
命令行参数
javah -classpath [path1] -jni [path2]
假设存在native方法的类路径为:C:\NDKFirst\app\src\main\java\org\ndk\ndkfirst\NDKTest.java
path1需要指定完整类路径的绝对路径。对于上面的例子path1为C:\NDKFirst\app\src\main\java
path2为含有的native方法的完整类路径(不包含后面的.java),对于上面的例子,就是如下形式:
org.ndk.ndkfirst.NDKTest
所以最后的命令如下
javah -classpath "C:\Users\Jay\Desktop\NDKFirst\app\src\main\java" -jni org.ndk.ndkfirst.NDKTest
最后生成的.h文件在C:\NDKFirst\app\src\main\java下,里面就有我们需要的JNI函数,copy一下就行了
当然,如果我们在C:\NDKFirst\app\src\main\java
下直接执行javah命令,那么就可以省下path1参数了。
//切换工作路径
cd C:\NDKFirst\app\src\main\java
javah org.ndk.ndkfirst.NDKTest
如果出现错误: 编码GBK的不可映射字符
提示,那么可以添加一下编码参数
javah -encoding UTF-8 org.ndk.ndkfirst.NDKTest
CMakeLists模板
cmake_minimum_required(VERSION 3.4.1)
#!!!!!!!!!!!!!
# 都是使用的相对CMakeLists.txt文件的路径,所以如果要看清楚CMakeLists.txt相对于想引入的c文件、头文件位置
#!!!!!!!!!!!!!
#导入头文件,头文件存在于/cpp/inc下面,可以调用多次,包含多个头文件目录,或者用空格隔开,写多个目录
include_directories(inc)
# 批量导入源文件,如果有子目录test,那么需要额外添加./test/*,也可以定义多个,!!!*不可以省略!!!
file(GLOB allFile * ./test/*)
add_library(
native-lib
SHARED
# 导入所有源文件
${allFile})
# 设置期望导入的so搜索位置,类似于我们配置的环境变量位置
# CMAKE_SOURCE_DIR : CMakeLists.txt所在的路径
# CMAKE_ANDROID_ARCH_ABI : 当前的CPU架构
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -L${CMAKE_SOURCE_DIR}/../jniLibs/${CMAKE_ANDROID_ARCH_ABI}")
target_link_libraries(
native-lib
log #这个会在sdk里面搜索liblog.so
fmod #在上面定义的位置搜索libfmod.so
fmodL)
更多Cmake配置可以查看NDK-CMake初探