Использование JNI в асинхронной задаче. Ошибка выполнения: JNI DETECTED ERROR IN APPLICATION: использование недопустимого объекта задания

Я работаю на сервере / клиентском приложении. Клиентская часть находится на устройстве 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:
Я обнаружил, что недействительный объект задания является первым параметром нативной функции.jstring in_info, Но я на 100% уверен, что параметр инициализирован с допустимым значением. Я также подозревал, что сбой виртуальной машины может быть связан с использованием встроенной функции в асинхронной задаче. Но на основании вопроса AsyncTask вызывает нативный метод.
Можно использовать встроенную функцию в асинхронной задаче.

Изменить 2:
Я мог бы устранить ошибки, но я до сих пор не знаю причину проблемы. В градле у меня следующие настройки

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:

андроид студия 2.3.3
Android SDK: 26.0.0
compileSdkVersion: 25
targetSdkVersion 25
buildToolsVersion 25.0.2
ndk r15b 15.1.4119039
ОС Ubuntu 16.0.4.2 LTS

Спасибо

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector