From 72dcc5813d7b46061a954e29a3b4b0d1ebc9330c Mon Sep 17 00:00:00 2001 From: luoliangyi <87842688@qq.com> Date: Fri, 3 Nov 2023 16:28:52 +0800 Subject: [PATCH] =?UTF-8?q?scannerlib=20jni=20=E5=AE=9E=E7=8E=B0=E5=9B=9E?= =?UTF-8?q?=E8=B0=83=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 | 6 +- sdk/scannerlib/HGScannerLibJni.cpp | 150 ++++++++++++++++++ .../java/com/easing/java/HGScannerLib.java | 21 +++ 3 files changed, 176 insertions(+), 1 deletion(-) diff --git a/build2/qt/HGScannerLib/HGScannerLib.def b/build2/qt/HGScannerLib/HGScannerLib.def index c6daf4ce..5dbc24e4 100644 --- a/build2/qt/HGScannerLib/HGScannerLib.def +++ b/build2/qt/HGScannerLib/HGScannerLib.def @@ -37,4 +37,8 @@ Java_com_easing_java_HGScannerLib_SaveImage Java_com_easing_java_HGScannerLib_ReleaseImage Java_com_easing_java_HGScannerLib_GetImageInfo Java_com_easing_java_HGScannerLib_GetImageData -Java_com_easing_java_HGScannerLib_GetImageDpi \ No newline at end of file +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 diff --git a/sdk/scannerlib/HGScannerLibJni.cpp b/sdk/scannerlib/HGScannerLibJni.cpp index 4c766471..1cbb154c 100644 --- a/sdk/scannerlib/HGScannerLibJni.cpp +++ b/sdk/scannerlib/HGScannerLibJni.cpp @@ -4,6 +4,7 @@ extern "C" JNIEXPORT jlong JNICALL Java_com_easing_java_HGScannerLib_LoadImage( JNIEnv* env, jclass clazz, jstring filePath) { + (void)clazz; printf("\nJava_com_easing_java_HGScannerLib_LoadImage\n"); jboolean isCopy; @@ -20,6 +21,7 @@ extern "C" JNIEXPORT jlong JNICALL Java_com_easing_java_HGScannerLib_LoadImage( extern "C" JNIEXPORT jboolean JNICALL Java_com_easing_java_HGScannerLib_SaveImage( JNIEnv* env, jclass clazz, jlong img, jstring filePath, jobject saveParam) { + (void)clazz; printf("\nJava_com_easing_java_HGScannerLib_SaveImage\n"); HGLibSaveImageParam saveParam2 = {0}; @@ -49,6 +51,8 @@ extern "C" JNIEXPORT jboolean JNICALL Java_com_easing_java_HGScannerLib_SaveImag extern "C" JNIEXPORT jboolean JNICALL Java_com_easing_java_HGScannerLib_ReleaseImage( JNIEnv* env, jclass clazz, jlong img) { + (void)env; + (void)clazz; printf("\nJava_com_easing_java_HGScannerLib_ReleaseImage\n"); HGBool ret = HGLib_ReleaseImage((HGLibImage)img); @@ -61,6 +65,7 @@ extern "C" JNIEXPORT jboolean JNICALL Java_com_easing_java_HGScannerLib_ReleaseI extern "C" JNIEXPORT jobject JNICALL Java_com_easing_java_HGScannerLib_GetImageInfo( JNIEnv* env, jclass clazz, jlong img) { + (void)clazz; printf("\nJava_com_easing_java_HGScannerLib_GetImageInfo\n"); jclass cls = env->FindClass("com/easing/java/HGLibImageInfo"); @@ -86,6 +91,7 @@ extern "C" JNIEXPORT jobject JNICALL Java_com_easing_java_HGScannerLib_GetImageI extern "C" JNIEXPORT jbyteArray JNICALL Java_com_easing_java_HGScannerLib_GetImageData( JNIEnv* env, jclass clazz, jlong img) { + (void)clazz; printf("\nJava_com_easing_java_HGScannerLib_GetImageData\n"); jbyteArray imgData; @@ -117,6 +123,7 @@ extern "C" JNIEXPORT jbyteArray JNICALL Java_com_easing_java_HGScannerLib_GetIma extern "C" JNIEXPORT jobject JNICALL Java_com_easing_java_HGScannerLib_GetImageDpi( JNIEnv* env, jclass clazz, jlong img) { + (void)clazz; printf("\nJava_com_easing_java_HGScannerLib_GetImageDpi\n"); jclass cls = env->FindClass("com/easing/java/HGLibImageDpi"); @@ -135,3 +142,146 @@ extern "C" JNIEXPORT jobject JNICALL Java_com_easing_java_HGScannerLib_GetImageD printf("\n"); return imgDpi; } + +JavaVM *g_VMDeviceHotPlug = NULL; +jobject g_objDeviceHotPlug = NULL; + +static void HGAPI DeviceHotPlugEventFunc(HGUInt event, const HGChar *deviceName, HGPointer param) +{ + (void)param; + if (NULL == g_VMDeviceHotPlug) + { + return; + } + + HGBool needDetach = HGFALSE; + JNIEnv *env = NULL; + + //获取当前native线程是否有没有被附加到jvm环境中 + int getEnvStat = g_VMDeviceHotPlug->GetEnv((void **)&env, JNI_VERSION_1_6); + if (getEnvStat == JNI_EDETACHED) + { + // 如果没有,主动附加到jvm环境中,获取到env + if (g_VMDeviceHotPlug->AttachCurrentThread((void **)&env, NULL) != 0) + { + return; + } + + needDetach = HGTRUE; + } + + //通过全局变量g_obj获取到要回调的类 + jclass cls = env->GetObjectClass(g_objDeviceHotPlug); + 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)); + } + } + + if (needDetach) + { + g_VMDeviceHotPlug->DetachCurrentThread(); + } +} + +extern "C" JNIEXPORT jboolean JNICALL Java_com_easing_java_HGScannerLib_InitDevice( + JNIEnv* env, jobject thiz) +{ + printf("\nJava_com_easing_java_HGScannerLib_InitDevice\n"); + + if (NULL != g_VMDeviceHotPlug) + { + printf("Already Init Device\n"); + return (jboolean)HGFALSE; + } + + env->GetJavaVM(&g_VMDeviceHotPlug); + g_objDeviceHotPlug = 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; + } + + printf("\n"); + return (jboolean)ret; +} + +extern "C" JNIEXPORT jboolean JNICALL Java_com_easing_java_HGScannerLib_DeinitDevice( + JNIEnv* env, jclass clazz) +{ + (void)clazz; + printf("\nJava_com_easing_java_HGScannerLib_DeinitDevice\n"); + + if (NULL == g_VMDeviceHotPlug) + { + printf("Do not Init Device yet\n"); + return (jboolean)HGFALSE; + } + + HGBool ret = HGLib_DeinitDevice(); + printf("ret=%d\n", ret); + if (ret) + { + env->DeleteGlobalRef(g_objDeviceHotPlug); + g_objDeviceHotPlug = NULL; + g_VMDeviceHotPlug = NULL; + } + + printf("\n"); + return (jboolean)ret; +} + +extern "C" JNIEXPORT jobjectArray JNICALL Java_com_easing_java_HGScannerLib_GetDeviceNameList( + JNIEnv* env, jclass clazz) +{ + (void)clazz; + printf("\nJava_com_easing_java_HGScannerLib_GetDeviceNameList\n"); + + jobjectArray devNameList; + + HGChar** devNameList2 = HGLib_GetDeviceNameList(); + printf("devNameList=0x%p\n", devNameList2); + if (NULL != devNameList2) + { + HGUInt count = 0; + HGChar** p = devNameList2; + while (0 != *p) + { + printf("devName=%s\n", *p); + ++count; + ++p; + } + + printf("count=%u\n", count); + + jclass cls = env->FindClass("java/lang/String"); + devNameList = env->NewObjectArray(count, cls, env->NewStringUTF(NULL)); + + HGUInt i = 0; + while (0 != devNameList2[i]) + { + env->SetObjectArrayElement(devNameList, i, env->NewStringUTF(devNameList2[i])); + ++i; + } + + HGLib_ReleaseDeviceNameList(devNameList2); + } + else + { + printf("cound=%u\n", 0); + + jclass cls = env->FindClass("java/lang/String"); + devNameList = env->NewObjectArray(0, cls, env->NewStringUTF(NULL)); + } + + printf("\n"); + return devNameList; +} diff --git a/test/scannerlib/huagao/java/com/easing/java/HGScannerLib.java b/test/scannerlib/huagao/java/com/easing/java/HGScannerLib.java index 0e476a0c..f3b243f3 100644 --- a/test/scannerlib/huagao/java/com/easing/java/HGScannerLib.java +++ b/test/scannerlib/huagao/java/com/easing/java/HGScannerLib.java @@ -33,6 +33,16 @@ public class HGScannerLib { public native byte[] GetImageData(long img); public native HGLibImageDpi GetImageDpi(long img); + public native boolean InitDevice(); + public native boolean DeinitDevice(); + public native String[] GetDeviceNameList(); + + public void onDeviceHotPlugEvent(int event, String deviceName) { + System.out.println("onDeviceHotPlugEvent"); + System.out.println("event=" + event); + System.out.println("deviceName=" + deviceName); + } + public static void main(String[] args) throws Exception { System.out.println("hello world"); @@ -64,5 +74,16 @@ public class HGScannerLib { System.out.println("imgData.length=" + imgData.length); inst.ReleaseImage(img); + + inst.InitDevice(); + + String[] devNameList = inst.GetDeviceNameList(); + System.out.println("devNameList:"); + for (int i = 0; i < devNameList.length; ++i) + { + System.out.println(" " + i + ":" + devNameList[i]); + } + + inst.DeinitDevice(); } } \ No newline at end of file