Qt - JNI在Android 5上崩溃

时间:2015-12-08 12:21:51

标签: java android c++ qt java-native-interface

我正在Android上开发一个应用程序。自从我在Android 5上开发以来,JNI已经崩溃了。我正在调试,结果是,这是我得到的一部分:

var session = new NotesSession();
session.InitializeUsingNotesUserName("username", "password");
var db = session.GetDatabase( "server", "xyz.nsf", false ); 

我搜索过,发现它与 .cpp 文件有关。 这是我的代码:

minixmpp.cpp:

F/art     (26030): art/runtime/check_jni.cc:65] JNI DETECTED ERROR IN APPLICATION: thread Thread[11,tid=26104,Native,Thread*=0xa1133400,peer=0x12c5b0e0,"QtThread"] using JNIEnv* from thread Thread[16,tid=26656,Runnable,Thread*=0x9f4b5400,peer=0x1316a5c0,"Thread-111421"]
F/art     (26030): art/runtime/check_jni.cc:65]     in call to NewStringUTF
F/art     (26030): art/runtime/check_jni.cc:65]     from void org.qtproject.example.myapplication.MiniXmppService.sendForwardMsg(java.lang.String, java.lang.String, int, int)
F/art     (26030): art/runtime/check_jni.cc:65] "QtThread" prio=10 tid=11 Runnable
F/art     (26030): art/runtime/check_jni.cc:65]   | group="main" sCount=0 dsCount=0 obj=0x12c5b0e0 self=0xa1133400
F/art     (26030): art/runtime/check_jni.cc:65]   | sysTid=26104 nice=-11 cgrp=apps sched=0/0 handle=0xb4fe4580
F/art     (26030): art/runtime/check_jni.cc:65]   | state=R schedstat=( 2571059638 546052025 2929 ) utm=216 stm=41 core=3 HZ=100
F/art     (26030): art/runtime/check_jni.cc:65]   | stack=0xa129f000-0xa12a1000 stackSize=1012KB
F/art     (26030): art/runtime/check_jni.cc:65]   | held mutexes= "mutator lock"(shared held)
F/art     (26030): art/runtime/check_jni.cc:65]   native: #00 pc 00004640  /system/lib/libbacktrace_libc++.so (UnwindCurrent::Unwind(unsigned int, ucontext*)+23)
F/art     (26030): art/runtime/check_jni.cc:65]   native: #01 pc 00002e8d  /system/lib/libbacktrace_libc++.so (Backtrace::Unwind(unsigned int, ucontext*)+8)
F/art     (26030): art/runtime/check_jni.cc:65]   native: #02 pc 002457f1  /system/lib/libart.so (art::DumpNativeStack(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, int, char const*, art::mirror::ArtMethod*)+68)
F/art     (26030): art/runtime/check_jni.cc:65]   native: #03 pc 0022a377  /system/lib/libart.so (art::Thread::Dump(std::__1::basic_ostream<char, std::__1::char_traits<char> >&) const+146)
F/art     (26030): art/runtime/check_jni.cc:65]   native: #04 pc 000b0b7b  /system/lib/libart.so (art::JniAbort(char const*, char const*)+582)
F/art     (26030): art/runtime/check_jni.cc:65]   native: #05 pc 000b12b5  /system/lib/libart.so (art::JniAbortF(char const*, char const*, ...)+60)
F/art     (26030): art/runtime/check_jni.cc:65]   native: #06 pc 000b432d  /system/lib/libart.so (art::ScopedCheck::ScopedCheck(_JNIEnv*, int, char const*)+1132)
F/art     (26030): art/runtime/check_jni.cc:65]   native: #07 pc 000bc169  /system/lib/libart.so (art::CheckJNI::NewStringUTF(_JNIEnv*, char const*)+20)
F/art     (26030): art/runtime/check_jni.cc:65]   native: #08 pc 00047ebb  /data/app/org.qtproject.example.myapplication-2/lib/arm/libminixmpp.so (CBot::sendForwardMsg(std::string const&, std::string const&, MessageType, MessageState)+54)
F/art     (26030): art/runtime/check_jni.cc:65]   native: #09 pc 00048885  /data/app/org.qtproject.example.myapplication-2/lib/arm/libminixmpp.so (Java_org_qtproject_example_myapplication_MiniXmppService_sendForwardMsg+88)
F/art     (26030): art/runtime/check_jni.cc:65]   native: #10 pc 000194af  /data/dalvik-cache/arm/data@app@org.qtproject.example.myapplication-2@base.apk@classes.dex (Java_org_qtproject_example_myapplication_MiniXmppService_sendForwardMsg__Ljava_lang_String_2Ljava_lang_String_2II+142)
F/art     (26030): art/runtime/check_jni.cc:65]   at org.qtproject.example.myapplication.MiniXmppService.sendForwardMsg(Native method)
F/art     (26030): art/runtime/check_jni.cc:65]   at org.qtproject.example.myapplication.CustomMainActivity.sendForwardMsg(CustomMainActivity.java:1574)

已编辑:我添加了jstrToStdStr()

    JNIEXPORT void JNICALL Java_org_qtproject_example_myapplication_MiniXmppService_sendForwardMsg(
            JNIEnv *env, jobject obj, jstring jid, jstring msg, jint type, jint state)
    {
        std::string sjid;
        jstrToStdStr(env, jid, sjid);
        std::string smsg;
        jstrToStdStr(env, msg, smsg);

        if (g_bot)
            g_bot->sendForwardMsg(sjid, smsg, (MessageType) type, (MessageState) state);
    }
void CBot::sendForwardMsg(const std::string &jid, const std::string &fullContent,
                          MessageType messageType, MessageState state)
{
    if ((!g_continue) || m_env == NULL)
        return;

    jstring jsJid = m_env->NewStringUTF(jid.c_str());
    jstring jsMsg;
    std::string date = "";
    jstring _date = m_env->NewStringUTF(date.c_str());
    std::string nickname = "";
    std::string filePath;
    std::string fileName;
    std::string fileType;
    std::string descriptionText;
    std::string msg;
    std::stringstream fullContentStream(fullContent);

    if (messageType == ImageMessage)
    {
        std::getline(fullContentStream, filePath);

        if (state == Received)
            fileName = filePath.substr(filePath.size() - 36 , 36);
        else
            fileName = filePath;

        filePath = g_outputMediaDir + "image/" + fileName;

        std::string fileExt = fileName.substr(fileName.size() - 3 , 3);

        if (fileExt == "jpg")
            fileType = "image/jpeg";
        else if (fileExt == "png")
            fileType = "image/png";

        std::string line2;
        std::getline(fullContentStream, line2);

        std::string to;

        while (std::getline(fullContentStream, to))
            descriptionText.append(to + "\n");

        unsigned found = descriptionText.find_last_of("\n");

        descriptionText = descriptionText.substr(0, found);

        msg = "<file><type>" + fileType + "</type><url>doi://xmpp.lopl.net/" + fileName +
                "</url><description>" + descriptionText + "</description></file>";

    }
}

有什么建议可以解决这个问题吗?

0 个答案:

没有答案