我正在研究服务器/客户端应用。客户端位于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
由于