Android NDK 项目集成 ACL Pack 完整指南
本文介绍如何将 ACL Pack 添加到 Android NDK 项目、初始化 license,并运行第一个算子。
前置条件
- Android Studio + NDK 26.3+(Clang 17)
- ACL Pack Android arm64-v8a SDK 压缩包
- 对应版本的
license.dat
项目结构
app/src/main/cpp/
├── CMakeLists.txt
├── include/acl/ # 从 SDK 中复制
└── native-lib.cpp
app/src/main/jniLibs/arm64-v8a/
└── libacl.a # 从 SDK 中复制
app/src/main/assets/
└── license.datCMakeLists.txt
cmake
cmake_minimum_required(VERSION 3.22.1)
project("acl_demo")
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
add_library(acl STATIC IMPORTED)
set_target_properties(acl PROPERTIES
IMPORTED_LOCATION ${CMAKE_SOURCE_DIR}/../jniLibs/arm64-v8a/libacl.a
)
add_library(native-lib SHARED native-lib.cpp)
target_include_directories(native-lib PRIVATE ${CMAKE_SOURCE_DIR}/include)
target_link_libraries(native-lib acl m log atomic z)原生代码
cpp
#include <jni.h>
#include <acl/acl.h>
#include <acl/api.h>
extern "C" JNIEXPORT jint JNICALL
Java_com_example_acl_MainActivity_initLicense(JNIEnv* env, jobject /*thiz*/, jstring path) {
const char* cpath = env->GetStringUTFChars(path, nullptr);
int rv = acl::init(cpath);
env->ReleaseStringUTFChars(path, cpath);
return rv;
}
extern "C" JNIEXPORT void JNICALL
Java_com_example_acl_MainActivity_processFrame(
JNIEnv* env, jobject /*thiz*/,
jlong src, jlong dst, jint w, jint h) {
acl::neon::cvtcolor::channelSwap<acl::BGR2RGB>(
reinterpret_cast<uint8_t*>(src),
reinterpret_cast<uint8_t*>(dst),
w, h
);
}License 文件
把 license.dat 放在 assets/ 目录,运行时再复制到应用私有目录:
kotlin
val licenseFile = File(filesDir, "license.dat")
assets.open("license.dat").use { input ->
licenseFile.outputStream().use { output ->
input.copyTo(output)
}
}
val rv = initLicense(licenseFile.absolutePath)常见坑点
- ABI 错误: ACL Pack 只提供
arm64-v8a,确保abiFilters包含它。 - 版本不匹配: Starter license 链接 Pro 库会返回
-1005。 - 未调用
init(): 在acl::init()成功前调用任何算子都会返回-1001。
下一步
从 v1.0.3 Release 下载最新 Android SDK。