Падает внешняя компонента на Android устройстве
Здравствуйте коллеги. Пишу внешнюю компоненту на Android. Все работает, все классно, но периодически, при закрытии приложения 1с (примерно 1 раз из 10) приложение вылетает с ошибкой.
Вот, примерно, как выглядит код вызова:
Локализовал ошибку до метода StopAPKMethod(). Если в цикле подергать методы connect(), disconnect() раз 100 - то приложение обязательно упадет с трассировкой стека:
Код самого APK тривиален:
Буду благодарен за помощь
Вот, примерно, как выглядит код вызова:
void connect() {
Initialize(L"com.symbol.datawedge.data_string", L"by.pikant.tsdmk");
StartAPKMethod();
}
void disconnect() {
StopAPKMethod();
}
void Initialize(std::wstring messageId, std::wstring intentAction) {
if (!obj) {
IAndroidComponentHelper* helper = (IAndroidComponentHelper*)GetInterface(eIAndroidComponentHelper);
if (helper) {
jclass ccloc = helper->FindClass(Addin1C::convertStringToPlatform(L"by.pikant.scanreader.TsdProxy").c_str());
if (ccloc) {
JNIEnv* env = getJniEnv();
cc = static_cast<jclass>(env->NewGlobalRef(ccloc));
env->DeleteLocalRef(ccloc);
jobject activity = helper->GetActivity();
jmethodID methID = env->GetMethodID(cc, "<init>", "(Landroid/app/Activity;JLjava/lang/String;Ljava/lang/String;)V");
jstring mId = wsz2jstr(messageId);
jstring IA = wsz2jstr(intentAction);
jobject objloc = env->NewObject(cc, methID, activity, (jlong)this, (jstring)mId, (jstring)IA);
env->DeleteLocalRef(mId);
env->DeleteLocalRef(IA);
obj = static_cast<jobject>(env->NewGlobalRef(objloc));
env->DeleteLocalRef(objloc);
methID = env->GetMethodID(cc, "show", "()V");
env->CallVoidMethod(obj, methID);
env->DeleteLocalRef(activity);
}
}
}
}
void StartAPKMethod(){
if (obj){
JNIEnv* env = getJniEnv();
jmethodID methID = env->GetMethodID(cc, "start", "()V");
env->CallVoidMethod(obj, methID);
}
}
void StopAPKMethod(){
if (obj) {
JNIEnv* env = getJniEnv();
jmethodID methID = env->GetMethodID(cc, "stop", "()V");
env->CallVoidMethod(obj, methID);
if (obj)
env->DeleteGlobalRef(obj);
if (cc)
env->DeleteGlobalRef(cc);
obj = nullptr;
cc = nullptr;
}
}
ПоказатьЛокализовал ошибку до метода StopAPKMethod(). Если в цикле подергать методы connect(), disconnect() раз 100 - то приложение обязательно упадет с трассировкой стека:
* * * * * * * * * * * * * * * *
Build fingerprint: 'Xiaomi/santoni/santoni:7.1.2/N2G47H/V10.1.1.0.NAMMIFI:user/release-keys'
Revision: '0'
ABI: 'arm'
pid: 30771, tid: 30794, name: pool-1-thread-1 >>> by.pikant.testVK <<<
signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x4
r0 c4dae8e0 r1 c4dae8e0 r2 00000001 r3 00000000
r4 c4dae8e0 r5 c767e7dc r6 c767e65c r7 cae8dfbc
r8 00000000 r9 c7c18000 sl 00000010 fp 00000000
ip c93e8ec5 sp c767e608 lr c8680cf5 pc c873d528 cpsr 800f0030
backtrace:
#00 pc 005ae528 /data/app/by.pikant.testVK-1/lib/arm/lib1cem.so
#01 pc 004f1cf3 /data/app/by.pikant.testVK-1/lib/arm/lib1cem.so
#02 pc 01259ed7 /data/app/by.pikant.testVK-1/lib/arm/lib1cem.so
#03 pc 015075b3 /data/app/by.pikant.testVK-1/lib/arm/lib1cem.so
#04 pc 015083a9 /data/app/by.pikant.testVK-1/lib/arm/lib1cem.so
#05 pc 0150cdcf /data/app/by.pikant.testVK-1/lib/arm/lib1cem.so
#06 pc 0151608f /data/app/by.pikant.testVK-1/lib/arm/lib1cem.so
#07 pc 01521a55 /data/app/by.pikant.testVK-1/lib/arm/lib1cem.so
#08 pc 01522b95 /data/app/by.pikant.testVK-1/lib/arm/lib1cem.so
#09 pc 0152e815 /data/app/by.pikant.testVK-1/lib/arm/lib1cem.so
#10 pc 0152f3cf /data/app/by.pikant.testVK-1/lib/arm/lib1cem.so
#11 pc 0073d5fb /data/app/by.pikant.testVK-1/lib/arm/lib1cem.so
#12 pc 0073b487 /data/app/by.pikant.testVK-1/lib/arm/lib1cem.so
#13 pc 007ac5f5 /data/app/by.pikant.testVK-1/lib/arm/lib1cem.so
#14 pc 007b9e3b /data/app/by.pikant.testVK-1/lib/arm/lib1cem.so
#15 pc 006bc153 /data/app/by.pikant.testVK-1/lib/arm/lib1cem.so
#16 pc 006bc1b9 /data/app/by.pikant.testVK-1/lib/arm/lib1cem.so
#17 pc 006b9ed5 /data/app/by.pikant.testVK-1/lib/arm/lib1cem.so
#18 pc 006bb613 /data/app/by.pikant.testVK-1/lib/arm/lib1cem.so
#19 pc 00692771 /data/app/by.pikant.testVK-1/lib/arm/lib1cem.so
#20 pc 006a37a9 /data/app/by.pikant.testVK-1/lib/arm/lib1cem.so
#21 pc 006a3d19 /data/app/by.pikant.testVK-1/lib/arm/lib1cem.so
#22 pc 006925bf /data/app/by.pikant.testVK-1/lib/arm/lib1cem.so
#23 pc 006a19d5 /data/app/by.pikant.testVK-1/lib/arm/lib1cem.so
#24 pc 007c82b3 /data/app/by.pikant.testVK-1/lib/arm/lib1cem.so
#25 pc 007c8769 /data/app/by.pikant.testVK-1/lib/arm/lib1cem.so
#26 pc 00e8bc2d /data/app/by.pikant.testVK-1/lib/arm/lib1cem.so
#27 pc 00e8bd3d /data/app/by.pikant.testVK-1/lib/arm/lib1cem.so
#28 pc 01b49737 /data/app/by.pikant.testVK-1/lib/arm/lib1cem.so
#29 pc 005a664b /data/app/by.pikant.testVK-1/lib/arm/lib1cem.so
#30 pc 005a6f77 /data/app/by.pikant.testVK-1/lib/arm/lib1cem.so
#31 pc 005a5417 /data/app/by.pikant.testVK-1/lib/arm/lib1cem.so
#32 pc 01b48513 /data/app/by.pikant.testVK-1/lib/arm/lib1cem.so
#33 pc 01b4856d /data/app/by.pikant.testVK-1/lib/arm/lib1cem.so
#34 pc 01b60d51 /data/app/by.pikant.testVK-1/lib/arm/lib1cem.so
#35 pc 01b60e39 /data/app/by.pikant.testVK-1/lib/arm/lib1cem.so
#36 pc 004ea9b5 /data/app/by.pikant.testVK-1/lib/arm/lib1cem.so
#37 pc 0046ffed /data/app/by.pikant.testVK-1/oat/arm/base.odex (offset 0x45e000)
ПоказатьКод самого APK тривиален:
package by.pikant.scanreader;
import android.app.Activity;
import android.content.IntentFilter;
public class TsdProxy implements Runnable {
private Activity mActivity; // custom activity of 1C:Enterprise
private ProxyReceiver mReceiver;
private String mIntentAction; // Название интента, который предполагается получить. Задается в программе управления ТСД.
public TsdProxy(Activity activity, long v8Object, String vMessageId, String vIntentAction){
mActivity = activity;
mIntentAction = vIntentAction;
mReceiver = new ProxyReceiver();
//"com.symbol.datawedge.data_string"
mReceiver.setScannerMessageID(vMessageId); // Идентификатор строки, которая передается сканером через Intent. Для Zebra это: com.symbol.datawedge.data_string
mReceiver.setV8Object(v8Object); // Ссылка на объект внешней компоненты
}
public void run() {
System.loadLibrary("libNativeComponent"); // Загружаем библиотеку внешней компоненты
}
public void show() {
mActivity.runOnUiThread(this);
}
public void start() {
if (mReceiver != null) {
mActivity.registerReceiver(mReceiver, new IntentFilter(mIntentAction)); //"by.pikant.tsdmk"
}
}
public void stop() {
if (mReceiver != null) {
mActivity.unregisterReceiver(mReceiver);
}
}
}
ПоказатьБуду благодарен за помощь
По теме из базы знаний
Свернуть все
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот