解决scannerlib jni崩溃问题

This commit is contained in:
luoliangyi 2023-11-23 15:29:10 +08:00
parent a43d33ac7c
commit f6cb1d072b
1 changed files with 29 additions and 60 deletions

View File

@ -304,10 +304,11 @@ extern "C" JNIEXPORT jobjectArray JNICALL Java_com_easing_java_HGScannerLib_GetD
return devNameList; return devNameList;
} }
static std::map<HGLibDevice, JNICallbackParam> g_deviceParams;
extern "C" JNIEXPORT jlong JNICALL Java_com_easing_java_HGScannerLib_OpenDevice( extern "C" JNIEXPORT jlong JNICALL Java_com_easing_java_HGScannerLib_OpenDevice(
JNIEnv* env, jclass clazz, jstring deviceName) JNIEnv* env, jobject thiz, jstring deviceName)
{ {
(void)clazz;
printf("\nJava_com_easing_java_HGScannerLib_OpenDevice\n"); printf("\nJava_com_easing_java_HGScannerLib_OpenDevice\n");
jboolean isCopy; jboolean isCopy;
@ -317,6 +318,14 @@ extern "C" JNIEXPORT jlong JNICALL Java_com_easing_java_HGScannerLib_OpenDevice(
printf("dev=0x%p\n", dev); printf("dev=0x%p\n", dev);
env->ReleaseStringUTFChars(deviceName, ptr); env->ReleaseStringUTFChars(deviceName, ptr);
if (NULL != dev)
{
JNICallbackParam deviceParam;
env->GetJavaVM(&deviceParam.vm);
deviceParam.obj = env->NewGlobalRef(thiz);
g_deviceParams[(HGLibDevice)dev] = deviceParam;
}
printf("\n"); printf("\n");
return (jlong)dev; return (jlong)dev;
} }
@ -324,12 +333,21 @@ extern "C" JNIEXPORT jlong JNICALL Java_com_easing_java_HGScannerLib_OpenDevice(
extern "C" JNIEXPORT jboolean JNICALL Java_com_easing_java_HGScannerLib_CloseDevice( extern "C" JNIEXPORT jboolean JNICALL Java_com_easing_java_HGScannerLib_CloseDevice(
JNIEnv* env, jclass clazz, jlong dev) JNIEnv* env, jclass clazz, jlong dev)
{ {
(void)env;
(void)clazz; (void)clazz;
printf("\nJava_com_easing_java_HGScannerLib_CloseDevice\n"); printf("\nJava_com_easing_java_HGScannerLib_CloseDevice\n");
HGBool ret = HGLib_CloseDevice((HGLibDevice)dev); HGBool ret = HGLib_CloseDevice((HGLibDevice)dev);
printf("ret=%d\n", ret); printf("ret=%d\n", ret);
if (ret)
{
std::map<HGLibDevice, JNICallbackParam>::iterator iter = g_deviceParams.find((HGLibDevice)dev);
assert(iter != g_deviceParams.end());
env->DeleteGlobalRef(iter->second.obj);
iter->second.obj = NULL;
iter->second.vm = NULL;
g_deviceParams.erase(iter);
}
printf("\n"); printf("\n");
return (jboolean)ret; return (jboolean)ret;
@ -383,13 +401,11 @@ extern "C" JNIEXPORT jstring JNICALL Java_com_easing_java_HGScannerLib_GetDevice
return fwVersion; return fwVersion;
} }
static std::map<HGLibDevice, JNICallbackParam> g_deviceScanParams;
static void HGAPI DeviceScanEventFunc(HGLibDevice device, HGUInt event, HGBool err, const HGChar *info, HGPointer param) static void HGAPI DeviceScanEventFunc(HGLibDevice device, HGUInt event, HGBool err, const HGChar *info, HGPointer param)
{ {
(void)param; (void)param;
std::map<HGLibDevice, JNICallbackParam>::iterator iter = g_deviceScanParams.find(device); std::map<HGLibDevice, JNICallbackParam>::iterator iter = g_deviceParams.find(device);
if (iter == g_deviceScanParams.end() || NULL == iter->second.vm) if (iter == g_deviceParams.end() || NULL == iter->second.vm)
{ {
return; return;
} }
@ -425,23 +441,13 @@ static void HGAPI DeviceScanEventFunc(HGLibDevice device, HGUInt event, HGBool e
{ {
iter->second.vm->DetachCurrentThread(); iter->second.vm->DetachCurrentThread();
} }
if (HGLIB_DEVSCAN_EVENT_END == event)
{
printf("HGLIB_DEVSCAN_EVENT_END == event\n");
env->DeleteGlobalRef(iter->second.obj);
iter->second.obj = NULL;
iter->second.vm = NULL;
g_deviceScanParams.erase(iter);
}
} }
static void HGAPI DeviceScanImageFunc(HGLibDevice device, HGLibImage image, HGPointer param) static void HGAPI DeviceScanImageFunc(HGLibDevice device, HGLibImage image, HGPointer param)
{ {
(void)param; (void)param;
std::map<HGLibDevice, JNICallbackParam>::iterator iter = g_deviceScanParams.find(device); std::map<HGLibDevice, JNICallbackParam>::iterator iter = g_deviceParams.find(device);
if (iter == g_deviceScanParams.end() || NULL == iter->second.vm) if (iter == g_deviceParams.end() || NULL == iter->second.vm)
{ {
return; return;
} }
@ -480,34 +486,14 @@ static void HGAPI DeviceScanImageFunc(HGLibDevice device, HGLibImage image, HGPo
} }
extern "C" JNIEXPORT jboolean JNICALL Java_com_easing_java_HGScannerLib_StartDeviceScan( extern "C" JNIEXPORT jboolean JNICALL Java_com_easing_java_HGScannerLib_StartDeviceScan(
JNIEnv* env, jobject thiz, jlong dev) JNIEnv* env, jclass clazz, jlong dev)
{ {
(void)env;
(void)clazz;
printf("\nJava_com_easing_java_HGScannerLib_StartDeviceScan\n"); printf("\nJava_com_easing_java_HGScannerLib_StartDeviceScan\n");
std::map<HGLibDevice, JNICallbackParam>::iterator iter = g_deviceScanParams.find((HGLibDevice)dev);
if (iter != g_deviceScanParams.end())
{
printf("Already Start Device Scan\n");
return (jboolean)HGFALSE;
}
JNICallbackParam deviceScanParam;
env->GetJavaVM(&deviceScanParam.vm);
deviceScanParam.obj = env->NewGlobalRef(thiz);
g_deviceScanParams[(HGLibDevice)dev] = deviceScanParam;
HGBool ret = HGLib_StartDeviceScan((HGLibDevice)dev, DeviceScanEventFunc, NULL, DeviceScanImageFunc, NULL); HGBool ret = HGLib_StartDeviceScan((HGLibDevice)dev, DeviceScanEventFunc, NULL, DeviceScanImageFunc, NULL);
printf("ret=%d\n", ret); printf("ret=%d\n", ret);
if (!ret)
{
std::map<HGLibDevice, JNICallbackParam>::iterator iter = g_deviceScanParams.find((HGLibDevice)dev);
assert(iter != g_deviceScanParams.end());
env->DeleteGlobalRef(iter->second.obj);
iter->second.obj = NULL;
iter->second.vm = NULL;
g_deviceScanParams.erase(iter);
}
printf("\n"); printf("\n");
return (jboolean)ret; return (jboolean)ret;
@ -516,29 +502,12 @@ extern "C" JNIEXPORT jboolean JNICALL Java_com_easing_java_HGScannerLib_StartDev
extern "C" JNIEXPORT jboolean JNICALL Java_com_easing_java_HGScannerLib_StopDeviceScan( extern "C" JNIEXPORT jboolean JNICALL Java_com_easing_java_HGScannerLib_StopDeviceScan(
JNIEnv* env, jclass clazz, jlong dev) JNIEnv* env, jclass clazz, jlong dev)
{ {
(void)env;
(void)clazz; (void)clazz;
printf("\nJava_com_easing_java_HGScannerLib_StopDeviceScan\n"); printf("\nJava_com_easing_java_HGScannerLib_StopDeviceScan\n");
std::map<HGLibDevice, JNICallbackParam>::iterator iter = g_deviceScanParams.find((HGLibDevice)dev);
if (iter == g_deviceScanParams.end())
{
printf("Do not Start Device Scan yet\n");
return (jboolean)HGFALSE;
}
HGBool ret = HGLib_StopDeviceScan((HGLibDevice)dev); HGBool ret = HGLib_StopDeviceScan((HGLibDevice)dev);
printf("ret=%d\n", ret); printf("ret=%d\n", ret);
if (ret)
{
std::map<HGLibDevice, JNICallbackParam>::iterator iter = g_deviceScanParams.find((HGLibDevice)dev);
if (iter != g_deviceScanParams.end())
{
env->DeleteGlobalRef(iter->second.obj);
iter->second.obj = NULL;
iter->second.vm = NULL;
g_deviceScanParams.erase(iter);
}
}
printf("\n"); printf("\n");
return (jboolean)ret; return (jboolean)ret;