Skip to content

Integrating ACL Pack into an Android NDK Project ​

This guide walks you through adding ACL Pack to an Android NDK project, initializing the license, and running your first operator.

What you need ​

  • Android Studio with NDK 26.3+ (Clang 17)
  • ACL Pack Android arm64-v8a SDK zip
  • A valid license.dat for your tier

Project layout ​

app/src/main/cpp/
  ├── CMakeLists.txt
  ├── include/acl/      # from SDK zip
  └── native-lib.cpp
app/src/main/jniLibs/arm64-v8a/
  └── libacl.a          # from SDK zip
app/src/main/assets/
  └── license.dat

CMakeLists.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)

Native code ​

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 file ​

Place license.dat in assets/ and copy it to the app’s private storage at runtime:

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)

Common pitfalls ​

  • Wrong ABI: ACL Pack only ships arm64-v8a. Make sure abiFilters includes arm64-v8a.
  • Tier mismatch: A Starter license linked against a Pro library returns -1005.
  • Missing init(): Any operator called before acl::init() succeeds returns -1001.

Next steps ​

Read the full integration guide and the API reference.


Download the latest Android SDK from the v1.0.3 release.