В Java это не было бы проблемой, но в Kotlin у нас нет статики. У нас есть сопутствующие объекты для той же цели, однако, будучи дополнительными объектами, они получают искаженное имя в вызовах JNI (Java_package_Type00024Companion_function), и это не совпадает с тем, что ожидает JNI. Вызов его из основного класса, очевидно, приводит к ошибке JNI в GetStaticMethodID.





Обходной путь — создать оболочку на Java и использовать ее из Kotlin.
@JvmStatic аннотация можно добавить к функции, определенной в сопутствующем объекте вызвать генерацию статического метода, на который вы можете ссылаться в своих вызовах jni.
Из связанных документов kotlin:
class C { companion object { @JvmStatic fun callStatic() {} fun callNonStatic() {} } }// java C.callStatic(); // works fine C.callNonStatic(); // error: not a static method
Замечательный. Я пытался найти аннотацию для изменения имени JNI по своему желанию, но это не сработало (оно меняет только фактическое имя функции, а не всю кашу), но я пропустил это. Спасибо.
Потратил на это 2 часа в подвешенном состоянии. Я вставил методы Java JNI, которые Android Studio автоматически преобразовала в Kotlin, но убрал эту @JvmStatic вещь.
Используйте внешнее ключевое слово в kotlin.
external fun nativeKey1() : String?
класс keys.c:
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];
}
Я не понимаю, как это могло бы мне помочь. Все эти функции JNI вызываются из определенного класса (реализация ожидает это имя типа). Либо я делаю весь класс на Java, либо на Kotlin. Я не могу смешивать два а-ля C#, иметь частичные объявления классов, не говоря уже о двух языках.