code_app/sdk/scannerlib/HGScannerLibJni.cpp

288 lines
8.5 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include <jni.h>
#include "HGScannerLib.h"
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;
const char* ptr = env->GetStringUTFChars(filePath, &isCopy);
printf("filePath=%s\n", ptr);
HGLibImage img = HGLib_LoadImage(ptr);
printf("img=0x%p\n", img);
env->ReleaseStringUTFChars(filePath, ptr);
printf("\n");
return (jlong)img;
}
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};
saveParam2.size = sizeof(HGLibSaveImageParam);
jclass cls = env->GetObjectClass(saveParam);
saveParam2.jpegQuality = (HGUInt)env->GetIntField(saveParam, env->GetFieldID(cls, "jpegQuality", "I"));
saveParam2.tiffCompression = (HGUInt)env->GetIntField(saveParam, env->GetFieldID(cls, "tiffCompression", "I"));
saveParam2.tiffJpegQuality = (HGUInt)env->GetIntField(saveParam, env->GetFieldID(cls, "tiffJpegQuality", "I"));
saveParam2.ocr = (HGBool)env->GetBooleanField(saveParam, env->GetFieldID(cls, "ocr", "Z"));
printf("jpegQuality=%u\n", saveParam2.jpegQuality);
printf("tiffCompression=%u\n", saveParam2.tiffCompression);
printf("tiffJpegQuality=%u\n", saveParam2.tiffJpegQuality);
printf("ocr=%d\n", saveParam2.ocr);
jboolean isCopy;
const char* ptr = env->GetStringUTFChars(filePath, &isCopy);
printf("img=0x%p, filePath=%s\n", (HGLibImage)img, ptr);
HGBool ret = HGLib_SaveImage((HGLibImage)img, ptr, &saveParam2);
printf("ret=%d\n", ret);
env->ReleaseStringUTFChars(filePath, ptr);
printf("\n");
return (jboolean)ret;
}
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);
printf("ret=%d\n", ret);
printf("\n");
return (jboolean)ret;
}
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");
jmethodID init = env->GetMethodID(cls, "<init>", "()V");
jobject imgInfo = env->NewObject(cls, init);
HGLibImageInfo imgInfo2 = {0};
HGBool ret = HGLib_GetImageInfo((HGLibImage)img, &imgInfo2);
printf("ret=%d\n", ret);
if (ret)
{
env->SetIntField(imgInfo, env->GetFieldID(cls, "width", "I"), imgInfo2.width);
env->SetIntField(imgInfo, env->GetFieldID(cls, "height", "I"), imgInfo2.height);
env->SetIntField(imgInfo, env->GetFieldID(cls, "type", "I"), imgInfo2.type);
env->SetIntField(imgInfo, env->GetFieldID(cls, "widthStep", "I"), imgInfo2.widthStep);
env->SetIntField(imgInfo, env->GetFieldID(cls, "origin", "I"), imgInfo2.origin);
}
printf("\n");
return imgInfo;
}
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;
HGByte *imgData2 = HGLib_GetImageData((HGLibImage)img);
printf("imgData=0x%p\n", imgData2);
if (NULL != imgData2)
{
HGLibImageInfo imgInfo = {0};
if (HGLib_GetImageInfo((HGLibImage)img, &imgInfo))
{
imgData = env->NewByteArray(imgInfo.widthStep * imgInfo.height);
env->SetByteArrayRegion(imgData, 0, imgInfo.widthStep * imgInfo.height, (const jbyte*)imgData2);
}
else
{
imgData = env->NewByteArray(0);
}
}
else
{
imgData = env->NewByteArray(0);
}
printf("\n");
return imgData;
}
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");
jmethodID init = env->GetMethodID(cls, "<init>", "()V");
jobject imgDpi = env->NewObject(cls, init);
HGUInt xDpi, yDpi;
HGBool ret = HGLib_GetImageDpi((HGLibImage)img, &xDpi, &yDpi);
printf("ret=%d\n", ret);
if (ret)
{
env->SetIntField(imgDpi, env->GetFieldID(cls, "xDpi", "I"), xDpi);
env->SetIntField(imgDpi, env->GetFieldID(cls, "yDpi", "I"), yDpi);
}
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;
}