Android:无法通过API连接到集成条形码扫描仪

时间:2013-12-30 00:11:47

标签: java android barcode-scanner

这有点模糊;)我正在尝试使用公司提供的API(http://sdgsystems.com/support/developers/)与Atid AT 911(它有一个内置的1D / 2D条形码扫描仪)连接。然而,我遇到了一系列障碍(其中一个缺乏文档,其中大部分是韩文)。尝试使用提供的JAR失败,因此我将源代码导入到我的项目中。

在一个文件(主扫描仪API文件ATScanLib)中,此行

static{System.load(ATLib.INTERNAL_PATH + "/libat_scanner_jni.so");}

未能加载提供的库,因此基于此答案( https://stackoverflow.com/a/20818603/1275278 )我将其更改为

static{System.load("/data/data/ca.ticketscene.app/lib/libat_scanner_jni.so");}

并成功加载文件。但是,现在当我尝试扫描时,它在库文件中失败了。我从我的BarcodeScanner类调用了API:

public class BarcodeScanner implements IScanner {

private ATScanLib scanner;

@Override
public void initiateScan(Activity activity) {

    this.scanner = new ATScanLib();
    this.scanner.power(true);
    this.scanner.init();
    this.scanner.setEncoding("UTF-8");
    this.scanner.setType("2D");

    this.scanner.setOnResponseListener(new ATScanLib.OnResponseListener() {

        public void onResponse(int arg0) {

            if(arg0 == ATScanLib.READ_OK) {
                String readData = scanner.getReadResults();
            } else if(arg0 == ATScanLib.READ_ENCODING_ERROR) {
                scanner.stop();
            }
        }
    });
    this.scanner.start();
}
}

问题出现在对scanner.start()的调用中。它在ATScanLib(随API提供)中调用此函数:

public class ATScanLib  {

static{System.load("/data/data/ca.ticketscene.app/lib/libat_scanner_jni.so");}

private native boolean Init(String dev, int baud);
private native void DeInit();
public native int Read(byte [] b);
private native void Power(boolean on);

public void start() {
    if ( mTask == null ) {

        mResult = new String ();

        mByteIndex = 0;
        Arrays.fill(mBytes, (byte)0);

        mSem = new Semaphore(1, true);
        try {

            mSem.acquire();

            Init(mDev, mBaud);

            mTask = new TagSequenceTask();
            mTask.execute();
        } catch (InterruptedException e1) {
            e1.printStackTrace();
        }
    } else
        Log.e("atid","::skip start");
}
}

在这里,问题是调用Init来调用此libat_scanner_jni.so库:

jboolean Java_com_atid_lib_ATScanLib_Init(JNIEnv* env, jobject thiz, jstring devName, jint baud) {
int cmd;
int w;
int ret;
jboolean iscopy;

const char *dev = (*env)->GetStringUTFChars(
            env, devName, &iscopy);

ret = init_serial(&gfd_serial, dev, baud);
if(ret < 0){
    LOGE("can't open DEV_SCAN\n");
    (*env)->ReleaseStringUTFChars(env, devName, dev);
    return JNI_FALSE;
}

gObj = (jobject)(*env)->NewGlobalRef(env, thiz);      
gClassGPS = (*env)->GetObjectClass(env, gObj);  

gCallback = (*env)->GetMethodID( env, gClassGPS, "notifyRead", "()V");
if ( gCallback == NULL ) {
    LOGE("can't find method NotifyRead\n");
    (*env)->ReleaseStringUTFChars(env, devName, dev);
    return JNI_FALSE;
}

read(gfd_serial,gTempBuf, BUF_SIZE);
while(!is_empty())
    pull_char();

gfd_dev = open(NODE_FILE, O_RDWR);

ioctl(gfd_dev, IOCTL_GPJ3_OUT_CLR, 2);
close(gfd_dev);

gTerminated = JNI_FALSE;
pthread_mutex_init(&gLock, NULL);
gThr_id=pthread_create(&gTid, NULL, native_thread, NULL);

(*env)->ReleaseStringUTFChars(env, devName, dev);

return JNI_TRUE;
}

来自该文件的日志消息是:

ERROR/libnav(3302): serial dev open error(/dev/s3c2410_serial1)
ERROR/libnav(3302): can't open DEV_SCAN

我很茫然。我所能想到的只是库文件所在的某种权限问题。我是Android的新手,所以这绝对是我的头脑,任何帮助都会非常感激。

1 个答案:

答案 0 :(得分:-1)

原来,提供的SDK是我提供的手机的错误版本。与他们的技术支持人员进行了长时间的谈话,成功地追踪了这一点。

如果它对其他人有帮助,可以在此处找到适合我的SDK版本:http://developer.sdgsystems.com/sdk/atid/AT911_ICS_SDK.zip