在异步任务中使用JNI。出现运行时错误:应用程序中的JNI DETECTED ERROR:使用无效的jobject

时间:2017-06-25 03:54:11

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

我正在研究服务器/客户端应用。客户端位于Android设备上。异步任务用于将数据发送到服务器。但是当我尝试使用JNI函数处理数据时,我有以下错误。

 JNI DETECTED ERROR IN APPLICATION: use of invalid jobject 0xb2f93d20
     from void com.labtest.dbclient.Conversation.send(java.lang.String, java.lang.String)
 "AsyncTask #1" prio=5 tid=17 Runnable
   | group="main" sCount=0 dsCount=0 obj=0x12e28550 self=0xa38ae600
   | sysTid=24815 nice=10 cgrp=bg_non_interactive sched=0/0 handle=0x9014f920
   | state=R schedstat=( 0 0 0 ) utm=0 stm=0 core=0 HZ=100
   | stack=0x9004d000-0x9004f000 stackSize=1038KB
   | held mutexes= "mutator lock"(shared held)
   native: #00 pc 00572f1e  /system/lib/libart.so (_ZN3art15DumpNativeStackERNSt3__113basic_ostreamIcNS0_11char_traitsIcEEEEiP12BacktraceMapPKcPNS_9ArtMethodEPv+238)
   native: #01 pc 0053f30e  /system/lib/libart.so (_ZNK3art6Thread9DumpStackERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEEbP12BacktraceMap+526)
   native: #02 pc 0053c30b  /system/lib/libart.so (_ZNK3art6Thread4DumpERNSt3__113basic_ostreamIcNS1_11char_traitsIcEEEEbP12BacktraceMap+75)
   native: #03 pc 00392418  /system/lib/libart.so (_ZN3art9JavaVMExt8JniAbortEPKcS2_+1560)
   native: #04 pc 00392dcc  /system/lib/libart.so (_ZN3art9JavaVMExt9JniAbortFEPKcS2_z+124)
   native: #05 pc 00544d53  /system/lib/libart.so (_ZNK3art6Thread13DecodeJObjectEP8_jobject+451)
   native: #06 pc 0000005d   (???)
   at com.labtest.dbclient.Conversation.send(Native method)
   at com.labtest.dbclient.Conversation.doInBackground(Conversation.java:108)
   at com.labtest.dbclient.Conversation.doInBackground(Conversation.java:21)
   at android.os.AsyncTask$2.call(AsyncTask.java:305)
   at java.util.concurrent.FutureTask.run(FutureTask.java:237)
   at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243)
   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
   at java.lang.Thread.run(Thread.java:761)

本机c ++代码是:

extern "C" JNIEXPORT void JNICALL Java_com_labtest_dbclient_Conversation_send(
        JNIEnv *env, jobject jobj, jstring in_info, jstring in_data)
{
    const char *ptr_info = env->GetStringUTFChars(in_info, NULL);
    const char *ptr_data = env->GetStringUTFChars(in_data, NULL);
... 
    env->ReleaseStringUTFChars(in_info, ptr_info);
    env->ReleaseStringUTFChars(in_data,ptr_data);
}

Java代码是:

public class EncryptedTcpClient extends AsyncTask<String, Void, Void> {
    public native void send(String in_info, String in_data);

    @Override
    protected Void doInBackground(String... in_params){
    ...
    send(in_params[0], in_params[1]);
    ...
    }
}

任何人都知道错误的原因是什么?

编辑1: 我发现无效的jobject是nvative funcion的第一个参数。jstring in_info。但我100%确定参数是用有效值初始化的。我还怀疑VM崩溃可能与在异步任务中使用本机函数有关。但基于问题AsyncTask call native method。 在异步任务中使用本机函数是可以的。

编辑2: 我可以解决错误,但我仍然不知道问题的原因。在gradle中,我有以下设置

ndk{
    // There is a compile error on MIPS architecture
    // so the MIPS is excluded from the project
    abiFilters 'x86', 'x86_64', 'armeabi', 'armeabi-v7a'
}

我正在使用x86架构模拟器。我删除了'x86'并使用x86_64架构模拟器,问题就消失了。

ndk{
    // There is a compile error on MIPS architecture
    // so the MIPS is excluded from the project
    abiFilters 'x86_64', 'armeabi', 'armeabi-v7a'
}

但是,在我看来应用程序无法为x86机器生成正确的二进制文件,或者我错过了一些配置步骤让android studio在设备上部署正确的二进制文件?或者我应该删除abi过滤器以生成胖包?

environement:

android studio 2.3.3
android SDK:26.0.0
compileSdkVersion:25
targetSdkVersion 25
buildToolsVersion 25.0.2
ndk r15b 15.1.4119039
os Ubuntu 16.0.4.2 LTS

由于

0 个答案:

没有答案