解决scannerlib jni崩溃问题
This commit is contained in:
parent
a43d33ac7c
commit
f6cb1d072b
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue