nim-ffi/examples/timer/android/build.gradle.kts
Ivan FB c51f313cd2
docs(examples): add Android (Kotlin/JNI) example over the native C ABI
An Android library module wrapping the timer library's native ABI behind an
idiomatic Kotlin `TimerNode` class via a JNI shim. `build-libs.sh` cross-compiles
two native libraries per ABI (arm64-v8a + x86_64) into src/main/jniLibs/:
libmy_timer.so (the Nim library) and libmy_timer_jni.so (the JNI bridge, which
NEEDs the former). The shim turns each Kotlin `external fun` into a blocking call
and reads the typed EchoResponse struct out of the result callback.

Gradle packages everything under jniLibs/ automatically; an instrumented test
covers create/version/echo on a device/emulator. Native build validated for
both ABIs (correct aarch64/x86_64 ELF, JNI symbols exported, libmy_timer.so
linked).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-05-31 18:37:20 +02:00

38 lines
1.0 KiB
Plaintext

// Android library module wrapping the timer library. The native .so files are
// produced by ./build-libs.sh into src/main/jniLibs/<abi>/ and packaged
// automatically by the Android Gradle plugin.
plugins {
id("com.android.library")
id("org.jetbrains.kotlin.android")
}
android {
namespace = "org.logos.mytimer"
compileSdk = 34
defaultConfig {
minSdk = 21
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
// Limit to the ABIs build-libs.sh produces. Add more rows there + here
// (armeabi-v7a, x86) if you need them.
ndk {
abiFilters += listOf("arm64-v8a", "x86_64")
}
}
sourceSets["main"].kotlin.srcDir("src/main/kotlin")
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
kotlinOptions {
jvmTarget = "17"
}
}
dependencies {
androidTestImplementation("androidx.test.ext:junit:1.1.5")
androidTestImplementation("androidx.test:runner:1.5.2")
}