From da9d7178cd89846701c5b6ee44dd1750ee570904 Mon Sep 17 00:00:00 2001 From: DatLag Date: Mon, 9 Dec 2024 14:31:08 +0100 Subject: [PATCH] prepare IntArray passing --- gradle/libs.versions.toml | 2 +- .../dev/datlag/sekret/gradle/SekretPlugin.kt | 2 +- .../kotlin/dev/datlag/sekret/JNIBindings.kt | 20 +++++++++++++++++-- .../kotlin/dev/datlag/sekret/ExtendSekret.kt | 2 +- .../kotlin/dev/datlag/sekret/JNIBindings.kt | 3 +++ .../kotlin/dev/datlag/sekret/JNIUtils.kt | 10 ++++++++-- .../kotlin/dev/datlag/sekret/JNIBindings.kt | 20 +++++++++++++++++-- 7 files changed, 50 insertions(+), 9 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 92a2de1..e65a1b3 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,5 +1,5 @@ [versions] -lib = "2.0.0-alpha-09" +lib = "2.0.0-alpha-10-SNAPSHOT" android = "8.4.2" auto-service = "1.1.1" kotlin = "2.1.0" diff --git a/sekret-gradle-plugin/src/main/java/dev/datlag/sekret/gradle/SekretPlugin.kt b/sekret-gradle-plugin/src/main/java/dev/datlag/sekret/gradle/SekretPlugin.kt index 619fff2..a6e8ce7 100644 --- a/sekret-gradle-plugin/src/main/java/dev/datlag/sekret/gradle/SekretPlugin.kt +++ b/sekret-gradle-plugin/src/main/java/dev/datlag/sekret/gradle/SekretPlugin.kt @@ -59,7 +59,7 @@ open class SekretPlugin : Plugin { } companion object { - private const val VERSION = "2.0.0-alpha-09" + private const val VERSION = "2.0.0-alpha-10-SNAPSHOT" internal fun getVersion(): String { return runCatching { diff --git a/sekret-lib/src/androidNativeMain/kotlin/dev/datlag/sekret/JNIBindings.kt b/sekret-lib/src/androidNativeMain/kotlin/dev/datlag/sekret/JNIBindings.kt index 58ed228..17b7dd1 100644 --- a/sekret-lib/src/androidNativeMain/kotlin/dev/datlag/sekret/JNIBindings.kt +++ b/sekret-lib/src/androidNativeMain/kotlin/dev/datlag/sekret/JNIBindings.kt @@ -4,12 +4,28 @@ import kotlinx.cinterop.* @OptIn(ExperimentalForeignApi::class) actual fun CPointer.newString(chars: CPointer, length: Int): jString? { - val method = pointed.pointed?.NewString ?: error("Could not find NewString method in JNI") + val method = pointed.pointed?.NewString ?: return null return method.invoke(this, chars, length) } @OptIn(ExperimentalForeignApi::class) actual fun jString.getStringUTFChars(env: CPointer): CPointer? { - val method = env.pointed.pointed?.GetStringUTFChars ?: error("Could not find GetStringUTFChars method in JNI") + val method = env.pointed.pointed?.GetStringUTFChars ?: return null return method.invoke(env, this, null) +} + +@OptIn(ExperimentalForeignApi::class) +actual fun CPointer.newIntArray(size: Int): jIntArray? { + val method = pointed.pointed?.NewIntArray ?: return null + return method.invoke(this, size) +} + +@OptIn(ExperimentalForeignApi::class) +actual fun CPointer.fill(target: jIntArray, value: IntArray): jIntArray? { + val method = pointed.pointed?.SetIntArrayRegion ?: return null + value.usePinned { pinnedArray -> + val pointer = pinnedArray.addressOf(0) + method.invoke(this, target, 0, value.size, pointer) + } + return target } \ No newline at end of file diff --git a/sekret-lib/src/jniNativeCommonMain/kotlin/dev/datlag/sekret/ExtendSekret.kt b/sekret-lib/src/jniNativeCommonMain/kotlin/dev/datlag/sekret/ExtendSekret.kt index 566d98f..a518656 100644 --- a/sekret-lib/src/jniNativeCommonMain/kotlin/dev/datlag/sekret/ExtendSekret.kt +++ b/sekret-lib/src/jniNativeCommonMain/kotlin/dev/datlag/sekret/ExtendSekret.kt @@ -11,6 +11,6 @@ public fun SekretHelper.getNativeValue( key: jString, env: CPointer ): jString? { - val obfuscator = key.getString(env) + val obfuscator = key.getString(env) ?: return null return SekretHelper.getNativeValue(secret, obfuscator).toJString(env) } \ No newline at end of file diff --git a/sekret-lib/src/jniNativeCommonMain/kotlin/dev/datlag/sekret/JNIBindings.kt b/sekret-lib/src/jniNativeCommonMain/kotlin/dev/datlag/sekret/JNIBindings.kt index 68c9475..a0b1ad7 100644 --- a/sekret-lib/src/jniNativeCommonMain/kotlin/dev/datlag/sekret/JNIBindings.kt +++ b/sekret-lib/src/jniNativeCommonMain/kotlin/dev/datlag/sekret/JNIBindings.kt @@ -24,6 +24,9 @@ typealias jCharVar = UShortVarOf typealias jInt = int32_t +@OptIn(ExperimentalForeignApi::class) +typealias jIntArray = CPointer + typealias jSize = jInt typealias jBoolean = uint8_t diff --git a/sekret-lib/src/jniNativeCommonMain/kotlin/dev/datlag/sekret/JNIUtils.kt b/sekret-lib/src/jniNativeCommonMain/kotlin/dev/datlag/sekret/JNIUtils.kt index ec0472d..42e7fd5 100644 --- a/sekret-lib/src/jniNativeCommonMain/kotlin/dev/datlag/sekret/JNIUtils.kt +++ b/sekret-lib/src/jniNativeCommonMain/kotlin/dev/datlag/sekret/JNIUtils.kt @@ -15,7 +15,13 @@ internal fun String.toJString(env: CPointer): jString? = memScoped { expect fun jString.getStringUTFChars(env: CPointer): CPointer? @OptIn(ExperimentalForeignApi::class) -internal fun jString.getString(env: CPointer): String { +internal fun jString.getString(env: CPointer): String? { val chars = getStringUTFChars(env) - return chars?.toKStringFromUtf8() ?: error("Unable to create String from the given jString") + return chars?.toKStringFromUtf8() } + +@OptIn(ExperimentalForeignApi::class) +expect fun CPointer.newIntArray(size: Int): jIntArray? + +@OptIn(ExperimentalForeignApi::class) +expect fun CPointer.fill(target: jIntArray, value: IntArray): jIntArray? diff --git a/sekret-lib/src/jniNativeMain/kotlin/dev/datlag/sekret/JNIBindings.kt b/sekret-lib/src/jniNativeMain/kotlin/dev/datlag/sekret/JNIBindings.kt index 7f5a24d..90d1c4c 100644 --- a/sekret-lib/src/jniNativeMain/kotlin/dev/datlag/sekret/JNIBindings.kt +++ b/sekret-lib/src/jniNativeMain/kotlin/dev/datlag/sekret/JNIBindings.kt @@ -4,12 +4,28 @@ import kotlinx.cinterop.* @OptIn(ExperimentalForeignApi::class) actual fun CPointer.newString(chars: CPointer, length: Int): jString? { - val method = pointed.pointed?.NewString ?: error("Could not find NewString method in JNI") + val method = pointed.pointed?.NewString ?: return null return method.invoke(this, chars, length) } @OptIn(ExperimentalForeignApi::class) actual fun jString.getStringUTFChars(env: CPointer): CPointer? { - val method = env.pointed.pointed?.GetStringUTFChars ?: error("Could not find GetStringUTFChars method in JNI") + val method = env.pointed.pointed?.GetStringUTFChars ?: return null return method.invoke(env, (this as? jstring), null) +} + +@OptIn(ExperimentalForeignApi::class) +actual fun CPointer.newIntArray(size: Int): jIntArray? { + val method = pointed.pointed?.NewIntArray ?: return null + return method.invoke(this, size) +} + +@OptIn(ExperimentalForeignApi::class) +actual fun CPointer.fill(target: jIntArray, value: IntArray): jIntArray? { + val method = pointed.pointed?.SetIntArrayRegion ?: return null + value.usePinned { pinnedArray -> + val pointer = pinnedArray.addressOf(0) + method.invoke(this, (target as? jintArray), 0, value.size, pointer) + } + return target } \ No newline at end of file