using this library:
implementation("io.github.landrynorris:jni-utils:0.0.1-alpha01")
This library provides bindings to the JNI library on Android.
The primary motivator of this library is the syntax for calling a method on JNIEnvVar
env.pointed.pointed?.SetObjectField?.invoke(env, fieldId, value)
This library allows you to write
env.setObjectField(fieldId, value)
Or take for example, converting a Kotlin String to a jstring:
//Raw JNI library
memScoped {
env.pointed.pointed?.newString?.invoke(myString.wcstr.ptr, length)
}
//This library
myString.toJString(env)
This library provides a DSL for registering JNI methods.
env.registerNatives {
clazz = env.findClass("io.github.landrynorris.sample.JniBridge".signature())
method("buttonClicked") {
signature = signature(::buttonClicked)
function = staticCFunction(::buttonClicked)
}
method("getText") {
signature = Signature(listOf(Long), String).toString()
function = staticCFunction(::getText)
}
}
You must provide a clazz value in the DSL.
There are two ways of defining the signature:
- the Signature() constructor. Provide a list of parameter signatures and a single return signature. The Signature#toString() method creates a signature that the JNI can recognize.
- For simple methods (jstring, jobject, etc. are not currently supported), you can use the signature(Function) method to automatically create a signature.