java-native-interface - art::JNI::NewStringUTF() 中的崩溃

标签 java-native-interface android-runtime

在我的 Google Play 开发者控制台中,我看到 NewStringUTF() 中有很多崩溃,如下所示:

  #00  pc 00000000001b9f22  /system/lib/libart.so (art::IndirectReferenceTable::Add(art::IRTSegmentState, art::ObjPtr<art::mirror::Object>, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char>>*)+630)
  #01  pc 00000000002ad461  /system/lib/libart.so (_jthrowable* art::JNIEnvExt::AddLocalReference<_jthrowable*>(art::ObjPtr<art::mirror::Object>)+32)
  #02  pc 0000000000298e49  /system/lib/libart.so (art::JNI::NewStringUTF(_JNIEnv*, char const*)+416)
  #03  pc 000000000024baf0  /data/app/com.steenriver.littlecrane-1vpoZWmGtL5mN2uxtEBltA==/lib/arm/liblittlecrane.so (androidsupport_reportFailedLaunch(char const*)+64)
  ...

所以实际崩溃是在 IndirectReferenceTable::Add() 调用中。

为什么 NewStringUTF() 调用会失败?
我传递给它一个普通的 ASCII 字符串,我的 'env' 指针不为空。

我的代码:
bool androidsupport_reportFailedLaunch( const char* msg )
{
        if ( !androidsupport_engine.app ) return false;

        JNIEnv* env = androidsupport_engine.app->appThreadEnv;
        if ( !env ) return false;

        jstring jniText = env->NewStringUTF( msg );
        EXCEPTION_RETURN( env );

        ...

msg 参数不是 nil,而是指向静态内存中的 const char*,因为函数的调用方式如下:
androidsupport_reportFailedLaunch( "Incompatible device." );

JNIEnv* 被缓存,但它被附加到本地线程,如下所示:
    int error = (*android_app->activity->vm)->AttachCurrentThread(android_app->activity->vm, &android_app->appThreadEnv, NULL);
    if (error) android_app->appThreadEnv = NULL;

根据 an Android example by nvidia .

最佳答案

NewStringUTF() accepts modified UTF-8 .欢迎使用 NewString()只要输入参数只包含 ASCII 字符,就可以构造一个常规的 Java String 对象。一旦它包含非 ASCII 字符,就可能需要手动转换。

关于java-native-interface - art::JNI::NewStringUTF() 中的崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57156453/

相关文章:

android - 通过 JNI 从 C++ 发送 Intent

c++ - 如何从 C++ 调用 JNI DLL

linux - 遇到错误 "*** glibc detected *** free(): invalid next size (fast)"

java - 您如何确定何时在运行时调用接口(interface)方法?

android - OAT 是什么意思?

Android C++ Matlab NDK 错误:对::rtNaN 的 undefined reference

opengl-es - Android,使用 NDK 优雅地关闭 OpenGL?

java - JVM 与 Dalvik 和/或 ART 究竟有何不同?

AndroidJunit4 不接受空格函数测试名?

java - 如何编译具有不存在引用的类?