这有点模糊;)我正在尝试使用公司提供的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的新手,所以这绝对是我的头脑,任何帮助都会非常感激。
答案 0 :(得分:-1)
原来,提供的SDK是我提供的手机的错误版本。与他们的技术支持人员进行了长时间的谈话,成功地追踪了这一点。
如果它对其他人有帮助,可以在此处找到适合我的SDK版本:http://developer.sdgsystems.com/sdk/atid/AT911_ICS_SDK.zip