Creé dos proyectos nativos de C++: uno con Kotlin como lenguaje base y otro con Java.
En ambos proyectos hice la misma modificación de las funciones de C++ creadas automáticamente:
extern "C" JNIEXPORT jstring JNICALL Java_com_stellarsolvers_test_MainActivity_stringFromJNI( JNIEnv* env, jobject /* this */, jstring s) { std::string hello = "Hello from C++"; return env->NewStringUTF(hello.c_str()); } Entonces agregué el parámetro: jstring s .
La definición también se modifica de la siguiente manera:
Kotlin:
external fun stringFromJNI(s: String): StringJava:
public native String stringFromJNI(String s);En el código de llamada proporcioné un valor de cadena para esta función:
Kotlin:
sample_text.text = stringFromJNI("Kotlin")Java:
tv.setText(stringFromJNI("Java"));No se realizaron otros cambios en ninguno de los proyectos.
Ambos proyectos son de la plantilla "Native C++" de
El único cambio en el asistente "Crear nuevo proyecto" es:
Esperaba que ambos proyectos funcionaran correctamente.
Con Java ese fue el caso.
Sin embargo, la aplicación de Kotlin se comporta de forma extraña: cuando la ejecución llega al punto en el que se debe invocar la función de C++, el programa falla con un SIGSEGV en el depurador en:
El seguimiento de pila de depuración es:
art_sigsegv_fault 0x00000000e7e571d0 art::FaultManager::HandleFault(int, siginfo*, void*) 0x00000000e7e57774 art::art_fault_handler(int, siginfo*, void*) (.llvm.650222801) 0x00000000e7e5749b ___lldb_unnamed_symbol22$$app_process32 0x00000000598aa6af ___lldb_unnamed_symbol2$$libc.so 0x00000000eace1c50 art::ManagedStack::ShadowFramesContain(art::StackReference<art::mirror::Object>*) const 0x00000000e8093086 art::Thread::DecodeJObject(_jobject*) const 0x00000000e81d8ac8 <unknown> 0x00000000e876d05d dlsym 0x00000000598a9530Una aplicación falla al ingresar al método nativo.
¿A qué se debe este comportamiento tan extraño de la aplicación Kotlin?
Acabo de intentar depurar en un dispositivo real: ASUS Zenfone Max Pro M1 (Android 8.1.0, API 27). Y tanto los proyectos de Kotlin como los de Java funcionan correctamente. El depurador permite ingresar al método nativo, no aparecen fallas.
Entonces, el estado del problema actualizado es: una aplicación se bloquea en el 100 % de los casos en el dispositivo virtual.