From 24538f5d119cd0d22c779a5cebac5c995869ee2c Mon Sep 17 00:00:00 2001 From: luoliangyi <87842688@qq.com> Date: Fri, 3 Nov 2023 18:07:27 +0800 Subject: [PATCH] =?UTF-8?q?scannerlib=20jni=E9=9B=86=E6=88=90=E6=89=AB?= =?UTF-8?q?=E6=8F=8F=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build2/qt/HGScannerLib/HGScannerLib.def | 8 +- sdk/scannerlib/HGLibDeviceImpl.cpp | 26 +- sdk/scannerlib/HGLibDeviceImpl.hpp | 3 +- sdk/scannerlib/HGScannerLibJni.cpp | 264 ++++++++++++++++-- .../java/com/easing/java/HGScannerLib.java | 33 +++ 5 files changed, 289 insertions(+), 45 deletions(-) diff --git a/build2/qt/HGScannerLib/HGScannerLib.def b/build2/qt/HGScannerLib/HGScannerLib.def index 5dbc24e4..798895bb 100644 --- a/build2/qt/HGScannerLib/HGScannerLib.def +++ b/build2/qt/HGScannerLib/HGScannerLib.def @@ -41,4 +41,10 @@ Java_com_easing_java_HGScannerLib_GetImageDpi Java_com_easing_java_HGScannerLib_InitDevice Java_com_easing_java_HGScannerLib_DeinitDevice -Java_com_easing_java_HGScannerLib_GetDeviceNameList \ No newline at end of file +Java_com_easing_java_HGScannerLib_GetDeviceNameList +Java_com_easing_java_HGScannerLib_OpenDevice +Java_com_easing_java_HGScannerLib_CloseDevice +Java_com_easing_java_HGScannerLib_GetDeviceSN +Java_com_easing_java_HGScannerLib_GetDeviceFWVersion +Java_com_easing_java_HGScannerLib_StartDeviceScan +Java_com_easing_java_HGScannerLib_StopDeviceScan \ No newline at end of file diff --git a/sdk/scannerlib/HGLibDeviceImpl.cpp b/sdk/scannerlib/HGLibDeviceImpl.cpp index 4dbf235c..fd200c6d 100644 --- a/sdk/scannerlib/HGLibDeviceImpl.cpp +++ b/sdk/scannerlib/HGLibDeviceImpl.cpp @@ -234,7 +234,6 @@ HGLibDeviceImpl::HGLibDeviceImpl() m_devName.clear(); m_dpi = 0; m_scanning = HGFALSE; - m_scanEvent = NULL; m_eventFunc = NULL; m_eventParam = NULL; m_imageFunc = NULL; @@ -1011,8 +1010,6 @@ HGBool HGLibDeviceImpl::StartScan(HGLibDeviceScanEventFunc eventFunc, HGPointer ReleaseParam(devParam); } - HGBase_CreateEvent(HGFALSE, HGFALSE, &m_scanEvent); - assert(NULL != m_scanEvent); m_eventFunc = eventFunc; m_eventParam = eventParam; m_imageFunc = imageFunc; @@ -1027,8 +1024,6 @@ HGBool HGLibDeviceImpl::StartScan(HGLibDeviceScanEventFunc eventFunc, HGPointer m_eventParam = NULL; m_imageFunc = NULL; m_imageParam = NULL; - HGBase_DestroyEvent(m_scanEvent); - m_scanEvent = NULL; m_dpi = 0; } else @@ -1045,13 +1040,10 @@ HGBool HGLibDeviceImpl::StopScan() { HGBool ret = HGFALSE; + sane_cancel(m_devHandle); HGBase_EnterLock(m_lock); if (m_scanning) { - sane_cancel(m_devHandle); - HGBase_WaitEvent(m_scanEvent); - HGBase_DestroyEvent(m_scanEvent); - m_scanEvent = NULL; m_eventFunc = NULL; m_eventParam = NULL; m_imageFunc = NULL; @@ -1067,17 +1059,7 @@ HGBool HGLibDeviceImpl::StopScan() HGBool HGLibDeviceImpl::StopScanAsyn() { - HGBool ret = HGFALSE; - - HGBase_EnterLock(m_lock); - if (m_scanning) - { - sane_cancel(m_devHandle); - ret = HGTRUE; - } - HGBase_LeaveLock(m_lock); - - return ret; + return StopScan(); } HGInt HGLibDeviceImpl::GetOperateCode() @@ -1209,12 +1191,8 @@ int HGLibDeviceImpl::sane_ex_callback(SANE_Handle hdev, int code, void* data, un HGLibDeviceScanEventFunc eventFunc = deviceImpl->m_eventFunc; HGPointer eventParam = deviceImpl->m_eventParam; - - HGBase_SetEvent(deviceImpl->m_scanEvent); HGBase_EnterLock(deviceImpl->m_lock); - HGBase_DestroyEvent(deviceImpl->m_scanEvent); - deviceImpl->m_scanEvent = NULL; deviceImpl->m_eventFunc = NULL; deviceImpl->m_eventParam = NULL; deviceImpl->m_imageFunc = NULL; diff --git a/sdk/scannerlib/HGLibDeviceImpl.hpp b/sdk/scannerlib/HGLibDeviceImpl.hpp index 07d71f4d..a47f3c4b 100644 --- a/sdk/scannerlib/HGLibDeviceImpl.hpp +++ b/sdk/scannerlib/HGLibDeviceImpl.hpp @@ -61,7 +61,6 @@ private: std::string m_devName; HGInt m_dpi; HGBool m_scanning; - HGEvent m_scanEvent; HGLibDeviceScanEventFunc m_eventFunc; HGPointer m_eventParam; HGLibDeviceScanImageFunc m_imageFunc; @@ -69,4 +68,4 @@ private: HGInt m_statusCode; }; -#endif /* __HGLIBDEVICEIMPL_HPP__ */ \ No newline at end of file +#endif /* __HGLIBDEVICEIMPL_HPP__ */ diff --git a/sdk/scannerlib/HGScannerLibJni.cpp b/sdk/scannerlib/HGScannerLibJni.cpp index 1cbb154c..b7034083 100644 --- a/sdk/scannerlib/HGScannerLibJni.cpp +++ b/sdk/scannerlib/HGScannerLibJni.cpp @@ -143,13 +143,13 @@ extern "C" JNIEXPORT jobject JNICALL Java_com_easing_java_HGScannerLib_GetImageD return imgDpi; } -JavaVM *g_VMDeviceHotPlug = NULL; -jobject g_objDeviceHotPlug = NULL; +JavaVM *g_VMDeviceHotPlugEvent = NULL; +jobject g_objDeviceHotPlugEvent = NULL; static void HGAPI DeviceHotPlugEventFunc(HGUInt event, const HGChar *deviceName, HGPointer param) { (void)param; - if (NULL == g_VMDeviceHotPlug) + if (NULL == g_VMDeviceHotPlugEvent) { return; } @@ -158,11 +158,11 @@ static void HGAPI DeviceHotPlugEventFunc(HGUInt event, const HGChar *deviceName, JNIEnv *env = NULL; //获取当前native线程是否有没有被附加到jvm环境中 - int getEnvStat = g_VMDeviceHotPlug->GetEnv((void **)&env, JNI_VERSION_1_6); + int getEnvStat = g_VMDeviceHotPlugEvent->GetEnv((void **)&env, JNI_VERSION_1_6); if (getEnvStat == JNI_EDETACHED) { // 如果没有,主动附加到jvm环境中,获取到env - if (g_VMDeviceHotPlug->AttachCurrentThread((void **)&env, NULL) != 0) + if (g_VMDeviceHotPlugEvent->AttachCurrentThread((void **)&env, NULL) != 0) { return; } @@ -171,19 +171,19 @@ static void HGAPI DeviceHotPlugEventFunc(HGUInt event, const HGChar *deviceName, } //通过全局变量g_obj获取到要回调的类 - jclass cls = env->GetObjectClass(g_objDeviceHotPlug); + jclass cls = env->GetObjectClass(g_objDeviceHotPlugEvent); if (NULL != cls) { jmethodID jmethodId = env->GetMethodID(cls, "onDeviceHotPlugEvent", "(ILjava/lang/String;)V"); if (NULL != jmethodId) { - env->CallVoidMethod(g_objDeviceHotPlug, jmethodId, (jint)event, env->NewStringUTF(deviceName)); + env->CallVoidMethod(g_objDeviceHotPlugEvent, jmethodId, (jint)event, env->NewStringUTF(deviceName)); } } if (needDetach) { - g_VMDeviceHotPlug->DetachCurrentThread(); + g_VMDeviceHotPlugEvent->DetachCurrentThread(); } } @@ -192,22 +192,22 @@ extern "C" JNIEXPORT jboolean JNICALL Java_com_easing_java_HGScannerLib_InitDevi { printf("\nJava_com_easing_java_HGScannerLib_InitDevice\n"); - if (NULL != g_VMDeviceHotPlug) + if (NULL != g_VMDeviceHotPlugEvent) { printf("Already Init Device\n"); return (jboolean)HGFALSE; } - env->GetJavaVM(&g_VMDeviceHotPlug); - g_objDeviceHotPlug = env->NewGlobalRef(thiz); + env->GetJavaVM(&g_VMDeviceHotPlugEvent); + g_objDeviceHotPlugEvent = env->NewGlobalRef(thiz); HGBool ret = HGLib_InitDevice(DeviceHotPlugEventFunc, NULL); printf("ret=%d\n", ret); if (!ret) { - env->DeleteGlobalRef(g_objDeviceHotPlug); - g_objDeviceHotPlug = NULL; - g_VMDeviceHotPlug = NULL; + env->DeleteGlobalRef(g_objDeviceHotPlugEvent); + g_objDeviceHotPlugEvent = NULL; + g_VMDeviceHotPlugEvent = NULL; } printf("\n"); @@ -220,7 +220,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_VMDeviceHotPlug) + if (NULL == g_VMDeviceHotPlugEvent) { printf("Do not Init Device yet\n"); return (jboolean)HGFALSE; @@ -230,9 +230,9 @@ extern "C" JNIEXPORT jboolean JNICALL Java_com_easing_java_HGScannerLib_DeinitDe printf("ret=%d\n", ret); if (ret) { - env->DeleteGlobalRef(g_objDeviceHotPlug); - g_objDeviceHotPlug = NULL; - g_VMDeviceHotPlug = NULL; + env->DeleteGlobalRef(g_objDeviceHotPlugEvent); + g_objDeviceHotPlugEvent = NULL; + g_VMDeviceHotPlugEvent = NULL; } printf("\n"); @@ -285,3 +285,231 @@ extern "C" JNIEXPORT jobjectArray JNICALL Java_com_easing_java_HGScannerLib_GetD printf("\n"); return devNameList; } + +extern "C" JNIEXPORT jlong JNICALL Java_com_easing_java_HGScannerLib_OpenDevice( + JNIEnv* env, jclass clazz, jstring deviceName) +{ + (void)clazz; + printf("\nJava_com_easing_java_HGScannerLib_OpenDevice\n"); + + jboolean isCopy; + const char* ptr = env->GetStringUTFChars(deviceName, &isCopy); + printf("deviceName=%s\n", ptr); + HGLibDevice dev = HGLib_OpenDevice(ptr); + printf("dev=0x%p\n", dev); + env->ReleaseStringUTFChars(deviceName, ptr); + + printf("\n"); + return (jlong)dev; +} + +extern "C" JNIEXPORT jboolean JNICALL Java_com_easing_java_HGScannerLib_CloseDevice( + JNIEnv* env, jclass clazz, jlong dev) +{ + (void)env; + (void)clazz; + printf("\nJava_com_easing_java_HGScannerLib_CloseDevice\n"); + + HGBool ret = HGLib_CloseDevice((HGLibDevice)dev); + printf("ret=%d\n", ret); + + printf("\n"); + return (jboolean)ret; +} + +extern "C" JNIEXPORT jstring JNICALL Java_com_easing_java_HGScannerLib_GetDeviceSN( + JNIEnv* env, jclass clazz, jlong dev) +{ + (void)clazz; + printf("\nJava_com_easing_java_HGScannerLib_GetDeviceSN\n"); + + jstring sn; + + HGChar sn2[256]; + HGBool ret = HGLib_GetDeviceSN((HGLibDevice)dev, sn2, 256); + printf("ret=%d\n", ret); + if (ret) + { + sn = env->NewStringUTF(sn2); + } + else + { + sn = env->NewStringUTF(NULL); + } + + printf("\n"); + return sn; +} + +extern "C" JNIEXPORT jstring JNICALL Java_com_easing_java_HGScannerLib_GetDeviceFWVersion( + JNIEnv* env, jclass clazz, jlong dev) +{ + (void)clazz; + printf("\nJava_com_easing_java_HGScannerLib_GetDeviceFWVersion\n"); + + jstring fwVersion; + + HGChar fwVersion2[256]; + HGBool ret = HGLib_GetDeviceFWVersion((HGLibDevice)dev, fwVersion2, 256); + printf("ret=%d\n", ret); + if (ret) + { + fwVersion = env->NewStringUTF(fwVersion2); + } + else + { + fwVersion = env->NewStringUTF(NULL); + } + + printf("\n"); + return fwVersion; +} + +JavaVM *g_VMDeviceScan = NULL; +jobject g_objDeviceScan = NULL; + +static void HGAPI DeviceScanEventFunc(HGLibDevice device, HGUInt event, HGBool err, const HGChar *info, HGPointer param) +{ + (void)param; + if (NULL == g_VMDeviceScan) + { + return; + } + + HGBool needDetach = HGFALSE; + JNIEnv *env = NULL; + + //获取当前native线程是否有没有被附加到jvm环境中 + int getEnvStat = g_VMDeviceScan->GetEnv((void **)&env, JNI_VERSION_1_6); + if (getEnvStat == JNI_EDETACHED) + { + // 如果没有,主动附加到jvm环境中,获取到env + if (g_VMDeviceScan->AttachCurrentThread((void **)&env, NULL) != 0) + { + return; + } + + needDetach = HGTRUE; + } + + //通过全局变量g_obj获取到要回调的类 + jclass cls = env->GetObjectClass(g_objDeviceScan); + 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)); + } + } + + if (needDetach) + { + g_VMDeviceScan->DetachCurrentThread(); + } + + if (HGLIB_DEVSCAN_EVENT_END == event) + { + printf("HGLIB_DEVSCAN_EVENT_END == event\n"); + + env->DeleteGlobalRef(g_objDeviceScan); + g_objDeviceScan = NULL; + g_VMDeviceScan = NULL; + } +} + +static void HGAPI DeviceScanImageFunc(HGLibDevice device, HGLibImage image, HGPointer param) +{ + (void)param; + if (NULL == g_VMDeviceScan) + { + return; + } + + HGBool needDetach = HGFALSE; + JNIEnv *env = NULL; + + //获取当前native线程是否有没有被附加到jvm环境中 + int getEnvStat = g_VMDeviceScan->GetEnv((void **)&env, JNI_VERSION_1_6); + if (getEnvStat == JNI_EDETACHED) + { + // 如果没有,主动附加到jvm环境中,获取到env + if (g_VMDeviceScan->AttachCurrentThread((void **)&env, NULL) != 0) + { + return; + } + + needDetach = HGTRUE; + } + + //通过全局变量g_obj获取到要回调的类 + jclass cls = env->GetObjectClass(g_objDeviceScan); + if (NULL != cls) + { + jmethodID jmethodId = env->GetMethodID(cls, "onDeviceScanImage", "(JJ)V"); + if (NULL != jmethodId) + { + env->CallVoidMethod(g_objDeviceScan, jmethodId, (jlong)device, (jlong)image); + } + } + + if (needDetach) + { + g_VMDeviceScan->DetachCurrentThread(); + } +} + +extern "C" JNIEXPORT jboolean JNICALL Java_com_easing_java_HGScannerLib_StartDeviceScan( + JNIEnv* env, jobject thiz, jlong dev) +{ + printf("\nJava_com_easing_java_HGScannerLib_StartDeviceScan\n"); + + if (NULL != g_VMDeviceScan) + { + printf("Already Start Device Scan\n"); + return (jboolean)HGFALSE; + } + + env->GetJavaVM(&g_VMDeviceScan); + g_objDeviceScan = env->NewGlobalRef(thiz); + + 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; + } + + printf("\n"); + return (jboolean)ret; +} + +extern "C" JNIEXPORT jboolean JNICALL Java_com_easing_java_HGScannerLib_StopDeviceScan( + JNIEnv* env, jclass clazz, jlong dev) +{ + (void)clazz; + printf("\nJava_com_easing_java_HGScannerLib_StopDeviceScan\n"); + + if (NULL == g_VMDeviceScan) + { + printf("Do not Start Device Scan yet\n"); + return (jboolean)HGFALSE; + } + + HGBool ret = HGLib_StopDeviceScan((HGLibDevice)dev); + printf("ret=%d\n", ret); + if (ret) + { + if (NULL != g_VMDeviceScan) + { + env->DeleteGlobalRef(g_objDeviceScan); + g_objDeviceScan = NULL; + g_VMDeviceScan = NULL; + } + } + + printf("\n"); + return (jboolean)ret; +} diff --git a/test/scannerlib/huagao/java/com/easing/java/HGScannerLib.java b/test/scannerlib/huagao/java/com/easing/java/HGScannerLib.java index f3b243f3..fac74ca6 100644 --- a/test/scannerlib/huagao/java/com/easing/java/HGScannerLib.java +++ b/test/scannerlib/huagao/java/com/easing/java/HGScannerLib.java @@ -36,6 +36,12 @@ public class HGScannerLib { public native boolean InitDevice(); public native boolean DeinitDevice(); public native String[] GetDeviceNameList(); + public native long OpenDevice(String deviceName); + public native boolean CloseDevice(long dev); + public native String GetDeviceSN(long dev); + public native String GetDeviceFWVersion(long dev); + public native boolean StartDeviceScan(long dev); + public native boolean StopDeviceScan(long dev); public void onDeviceHotPlugEvent(int event, String deviceName) { System.out.println("onDeviceHotPlugEvent"); @@ -43,6 +49,18 @@ public class HGScannerLib { System.out.println("deviceName=" + deviceName); } + public void onDeviceScanEvent(long dev, int event, boolean err, String info) { + System.out.println("onDeviceScanEvent"); + System.out.println("event=" + event); + System.out.println("err=" + err); + System.out.println("info=" + info); + } + + public void onDeviceScanImage(long dev, long img) { + System.out.println("onDeviceScanImage"); + System.out.println("img=" + img); + } + public static void main(String[] args) throws Exception { System.out.println("hello world"); @@ -84,6 +102,21 @@ public class HGScannerLib { System.out.println(" " + i + ":" + devNameList[i]); } + if (devNameList.length > 0) + { + long dev = inst.OpenDevice(devNameList[0]); + String sn = inst.GetDeviceSN(dev); + System.out.println("sn=" + sn); + String fwVersion = inst.GetDeviceFWVersion(dev); + System.out.println("fwVersion=" + fwVersion); + + inst.StartDeviceScan(dev); + + inst.StopDeviceScan(dev); + + inst.CloseDevice(dev); + } + inst.DeinitDevice(); } } \ No newline at end of file