JNI必备小技巧

/ 0评 / 0

打印日志

#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初探

发表回复

您的电子邮箱地址不会被公开。