diff --git a/sdk/scannerlib/HGLibDeviceImpl.cpp b/sdk/scannerlib/HGLibDeviceImpl.cpp index fd200c6d..1c61ca67 100644 --- a/sdk/scannerlib/HGLibDeviceImpl.cpp +++ b/sdk/scannerlib/HGLibDeviceImpl.cpp @@ -1189,8 +1189,11 @@ int HGLibDeviceImpl::sane_ex_callback(SANE_Handle hdev, int code, void* data, un (0 != *len), (const char*)data, deviceImpl->m_eventParam); } - HGLibDeviceScanEventFunc eventFunc = deviceImpl->m_eventFunc; - HGPointer eventParam = deviceImpl->m_eventParam; + if (NULL != deviceImpl->m_eventFunc) + { + deviceImpl->m_eventFunc((HGLibDevice)deviceImpl, HGLIB_DEVSCAN_EVENT_END, + HGFALSE, NULL, deviceImpl->m_eventParam); + } HGBase_EnterLock(deviceImpl->m_lock); deviceImpl->m_eventFunc = NULL; @@ -1200,12 +1203,6 @@ int HGLibDeviceImpl::sane_ex_callback(SANE_Handle hdev, int code, void* data, un deviceImpl->m_scanning = HGFALSE; deviceImpl->m_dpi = 0; HGBase_LeaveLock(deviceImpl->m_lock); - - if (NULL != eventFunc) - { - eventFunc((HGLibDevice)deviceImpl, HGLIB_DEVSCAN_EVENT_END, - HGFALSE, NULL, eventParam); - } } break; case SANE_EVENT_STATUS: diff --git a/sdk/scannerlib/HGScannerLibJni.cpp b/sdk/scannerlib/HGScannerLibJni.cpp index b7034083..98ccd4d7 100644 --- a/sdk/scannerlib/HGScannerLibJni.cpp +++ b/sdk/scannerlib/HGScannerLibJni.cpp @@ -1,5 +1,13 @@ #include #include "HGScannerLib.h" +#include +#include + +struct JNICallbackParam +{ + JavaVM *vm; + jobject obj; +}; extern "C" JNIEXPORT jlong JNICALL Java_com_easing_java_HGScannerLib_LoadImage( JNIEnv* env, jclass clazz, jstring filePath) @@ -143,13 +151,12 @@ extern "C" JNIEXPORT jobject JNICALL Java_com_easing_java_HGScannerLib_GetImageD return imgDpi; } -JavaVM *g_VMDeviceHotPlugEvent = NULL; -jobject g_objDeviceHotPlugEvent = NULL; +static JNICallbackParam g_deviceHotPlugParam; static void HGAPI DeviceHotPlugEventFunc(HGUInt event, const HGChar *deviceName, HGPointer param) { (void)param; - if (NULL == g_VMDeviceHotPlugEvent) + if (NULL == g_deviceHotPlugParam.vm) { return; } @@ -158,11 +165,11 @@ static void HGAPI DeviceHotPlugEventFunc(HGUInt event, const HGChar *deviceName, JNIEnv *env = NULL; //获取当前native线程是否有没有被附加到jvm环境中 - int getEnvStat = g_VMDeviceHotPlugEvent->GetEnv((void **)&env, JNI_VERSION_1_6); + int getEnvStat = g_deviceHotPlugParam.vm->GetEnv((void **)&env, JNI_VERSION_1_6); if (getEnvStat == JNI_EDETACHED) { // 如果没有,主动附加到jvm环境中,获取到env - if (g_VMDeviceHotPlugEvent->AttachCurrentThread((void **)&env, NULL) != 0) + if (g_deviceHotPlugParam.vm->AttachCurrentThread((void **)&env, NULL) != 0) { return; } @@ -171,19 +178,19 @@ static void HGAPI DeviceHotPlugEventFunc(HGUInt event, const HGChar *deviceName, } //通过全局变量g_obj获取到要回调的类 - jclass cls = env->GetObjectClass(g_objDeviceHotPlugEvent); + jclass cls = env->GetObjectClass(g_deviceHotPlugParam.obj); if (NULL != cls) { jmethodID jmethodId = env->GetMethodID(cls, "onDeviceHotPlugEvent", "(ILjava/lang/String;)V"); if (NULL != jmethodId) { - env->CallVoidMethod(g_objDeviceHotPlugEvent, jmethodId, (jint)event, env->NewStringUTF(deviceName)); + env->CallVoidMethod(g_deviceHotPlugParam.obj, jmethodId, (jint)event, env->NewStringUTF(deviceName)); } } if (needDetach) { - g_VMDeviceHotPlugEvent->DetachCurrentThread(); + g_deviceHotPlugParam.vm->DetachCurrentThread(); } } @@ -192,22 +199,22 @@ extern "C" JNIEXPORT jboolean JNICALL Java_com_easing_java_HGScannerLib_InitDevi { printf("\nJava_com_easing_java_HGScannerLib_InitDevice\n"); - if (NULL != g_VMDeviceHotPlugEvent) + if (NULL != g_deviceHotPlugParam.vm) { printf("Already Init Device\n"); return (jboolean)HGFALSE; } - env->GetJavaVM(&g_VMDeviceHotPlugEvent); - g_objDeviceHotPlugEvent = env->NewGlobalRef(thiz); + env->GetJavaVM(&g_deviceHotPlugParam.vm); + g_deviceHotPlugParam.obj = env->NewGlobalRef(thiz); HGBool ret = HGLib_InitDevice(DeviceHotPlugEventFunc, NULL); printf("ret=%d\n", ret); if (!ret) { - env->DeleteGlobalRef(g_objDeviceHotPlugEvent); - g_objDeviceHotPlugEvent = NULL; - g_VMDeviceHotPlugEvent = NULL; + env->DeleteGlobalRef(g_deviceHotPlugParam.obj); + g_deviceHotPlugParam.obj = NULL; + g_deviceHotPlugParam.vm = NULL; } printf("\n"); @@ -220,7 +227,7 @@ extern "C" JNIEXPORT jboolean JNICALL Java_com_easing_java_HGScannerLib_DeinitDe (void)clazz; printf("\nJava_com_easing_java_HGScannerLib_DeinitDevice\n"); - if (NULL == g_VMDeviceHotPlugEvent) + if (NULL == g_deviceHotPlugParam.vm) { printf("Do not Init Device yet\n"); return (jboolean)HGFALSE; @@ -230,9 +237,9 @@ extern "C" JNIEXPORT jboolean JNICALL Java_com_easing_java_HGScannerLib_DeinitDe printf("ret=%d\n", ret); if (ret) { - env->DeleteGlobalRef(g_objDeviceHotPlugEvent); - g_objDeviceHotPlugEvent = NULL; - g_VMDeviceHotPlugEvent = NULL; + env->DeleteGlobalRef(g_deviceHotPlugParam.obj); + g_deviceHotPlugParam.obj = NULL; + g_deviceHotPlugParam.vm = NULL; } printf("\n"); @@ -365,13 +372,13 @@ extern "C" JNIEXPORT jstring JNICALL Java_com_easing_java_HGScannerLib_GetDevice return fwVersion; } -JavaVM *g_VMDeviceScan = NULL; -jobject g_objDeviceScan = NULL; +static std::map g_deviceScanParams; static void HGAPI DeviceScanEventFunc(HGLibDevice device, HGUInt event, HGBool err, const HGChar *info, HGPointer param) { (void)param; - if (NULL == g_VMDeviceScan) + std::map::iterator iter = g_deviceScanParams.find(device); + if (iter == g_deviceScanParams.end() || NULL == iter->second.vm) { return; } @@ -380,11 +387,11 @@ static void HGAPI DeviceScanEventFunc(HGLibDevice device, HGUInt event, HGBool e JNIEnv *env = NULL; //获取当前native线程是否有没有被附加到jvm环境中 - int getEnvStat = g_VMDeviceScan->GetEnv((void **)&env, JNI_VERSION_1_6); + int getEnvStat = iter->second.vm->GetEnv((void **)&env, JNI_VERSION_1_6); if (getEnvStat == JNI_EDETACHED) { // 如果没有,主动附加到jvm环境中,获取到env - if (g_VMDeviceScan->AttachCurrentThread((void **)&env, NULL) != 0) + if (iter->second.vm->AttachCurrentThread((void **)&env, NULL) != 0) { return; } @@ -393,35 +400,37 @@ static void HGAPI DeviceScanEventFunc(HGLibDevice device, HGUInt event, HGBool e } //通过全局变量g_obj获取到要回调的类 - jclass cls = env->GetObjectClass(g_objDeviceScan); + jclass cls = env->GetObjectClass(iter->second.obj); if (NULL != cls) { jmethodID jmethodId = env->GetMethodID(cls, "onDeviceScanEvent", "(JIZLjava/lang/String;)V"); if (NULL != jmethodId) { - env->CallVoidMethod(g_objDeviceScan, jmethodId, (jlong)device, (jint)event, (jboolean)err, env->NewStringUTF(info)); + env->CallVoidMethod(iter->second.obj, jmethodId, (jlong)device, (jint)event, (jboolean)err, env->NewStringUTF(info)); } } if (needDetach) { - g_VMDeviceScan->DetachCurrentThread(); + iter->second.vm->DetachCurrentThread(); } if (HGLIB_DEVSCAN_EVENT_END == event) { printf("HGLIB_DEVSCAN_EVENT_END == event\n"); - env->DeleteGlobalRef(g_objDeviceScan); - g_objDeviceScan = NULL; - g_VMDeviceScan = NULL; + 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) { (void)param; - if (NULL == g_VMDeviceScan) + std::map::iterator iter = g_deviceScanParams.find(device); + if (iter == g_deviceScanParams.end() || NULL == iter->second.vm) { return; } @@ -430,11 +439,11 @@ static void HGAPI DeviceScanImageFunc(HGLibDevice device, HGLibImage image, HGPo JNIEnv *env = NULL; //获取当前native线程是否有没有被附加到jvm环境中 - int getEnvStat = g_VMDeviceScan->GetEnv((void **)&env, JNI_VERSION_1_6); + int getEnvStat = iter->second.vm->GetEnv((void **)&env, JNI_VERSION_1_6); if (getEnvStat == JNI_EDETACHED) { // 如果没有,主动附加到jvm环境中,获取到env - if (g_VMDeviceScan->AttachCurrentThread((void **)&env, NULL) != 0) + if (iter->second.vm->AttachCurrentThread((void **)&env, NULL) != 0) { return; } @@ -443,19 +452,19 @@ static void HGAPI DeviceScanImageFunc(HGLibDevice device, HGLibImage image, HGPo } //通过全局变量g_obj获取到要回调的类 - jclass cls = env->GetObjectClass(g_objDeviceScan); + jclass cls = env->GetObjectClass(iter->second.obj); if (NULL != cls) { jmethodID jmethodId = env->GetMethodID(cls, "onDeviceScanImage", "(JJ)V"); if (NULL != jmethodId) { - env->CallVoidMethod(g_objDeviceScan, jmethodId, (jlong)device, (jlong)image); + env->CallVoidMethod(iter->second.obj, jmethodId, (jlong)device, (jlong)image); } } if (needDetach) { - g_VMDeviceScan->DetachCurrentThread(); + iter->second.vm->DetachCurrentThread(); } } @@ -464,22 +473,29 @@ extern "C" JNIEXPORT jboolean JNICALL Java_com_easing_java_HGScannerLib_StartDev { printf("\nJava_com_easing_java_HGScannerLib_StartDeviceScan\n"); - if (NULL != g_VMDeviceScan) + std::map::iterator iter = g_deviceScanParams.find((HGLibDevice)dev); + if (iter != g_deviceScanParams.end()) { printf("Already Start Device Scan\n"); return (jboolean)HGFALSE; } - env->GetJavaVM(&g_VMDeviceScan); - g_objDeviceScan = env->NewGlobalRef(thiz); + 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); printf("ret=%d\n", ret); if (!ret) { - env->DeleteGlobalRef(g_objDeviceScan); - g_objDeviceScan = NULL; - g_VMDeviceScan = NULL; + std::map::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"); @@ -492,7 +508,8 @@ extern "C" JNIEXPORT jboolean JNICALL Java_com_easing_java_HGScannerLib_StopDevi (void)clazz; printf("\nJava_com_easing_java_HGScannerLib_StopDeviceScan\n"); - if (NULL == g_VMDeviceScan) + std::map::iterator iter = g_deviceScanParams.find((HGLibDevice)dev); + if (iter == g_deviceScanParams.end()) { printf("Do not Start Device Scan yet\n"); return (jboolean)HGFALSE; @@ -502,11 +519,13 @@ extern "C" JNIEXPORT jboolean JNICALL Java_com_easing_java_HGScannerLib_StopDevi printf("ret=%d\n", ret); if (ret) { - if (NULL != g_VMDeviceScan) + std::map::iterator iter = g_deviceScanParams.find((HGLibDevice)dev); + if (iter != g_deviceScanParams.end()) { - env->DeleteGlobalRef(g_objDeviceScan); - g_objDeviceScan = NULL; - g_VMDeviceScan = NULL; + env->DeleteGlobalRef(iter->second.obj); + iter->second.obj = NULL; + iter->second.vm = NULL; + g_deviceScanParams.erase(iter); } } diff --git a/test/scannerlib/huagao/java/com/easing/java/HGScannerLib.java b/test/scannerlib/huagao/java/com/easing/java/HGScannerLib.java index fac74ca6..53c120b1 100644 --- a/test/scannerlib/huagao/java/com/easing/java/HGScannerLib.java +++ b/test/scannerlib/huagao/java/com/easing/java/HGScannerLib.java @@ -112,7 +112,7 @@ public class HGScannerLib { inst.StartDeviceScan(dev); - inst.StopDeviceScan(dev); + //inst.StopDeviceScan(dev); inst.CloseDevice(dev); }