Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to call a static JNI function from Kotlin?

It wouldn't be a problem in Java but in Kotlin, we don't have static. We have companion objects for the same purpose, however, being extra objects, they get a mangled name in JNI calls (Java_package_Type00024Companion_function) and this doesn't match up with what JNI expects. Calling it from the main class, obviously, results in a JNI error in GetStaticMethodID.

like image 348
Gábor Avatar asked Feb 03 '23 17:02

Gábor


2 Answers

The @JvmStatic annotation can be added to the function defined on the companion object to cause the generation of a static method which you can refer to in you jni calls.

From the linked kotlin docs:

class C {
  companion object {
    @JvmStatic fun callStatic() {}
    fun callNonStatic() {}
  }
}
// java
C.callStatic(); // works fine
C.callNonStatic(); // error: not a static method
like image 160
SpencerPark Avatar answered Feb 06 '23 16:02

SpencerPark


Use external keyword in kotlin.

external fun nativeKey1() : String?

keys.c class:

Java_com_mobile_application_MyApplication_00024Companion_nativeKey1(
    JNIEnv *env, jobject thiz) {
static const char randomStr[] = "89!Q4q+x#f6~iOL9@&c>2JY!s!x@2Ai-SbHYA@EenokBTE#NoTiE6jl4-5zovso@2Ai-SbHYAEenokBNoTiE6jl4SbHYA@EenokBTE";
char key[17] = {0};

// Start garbage code
int i = 0;
float j = 0;
int loop_count = 0;

for (i=0; i < loop_count; i++) {
    int n = (i / 2) + 29 + i + 17;
    key[0] = randomStr[n];

}

like image 45
VIVEK CHOUDHARY Avatar answered Feb 06 '23 15:02

VIVEK CHOUDHARY