我正在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>";
}
}
有什么建议可以解决这个问题吗?