Android OTG usb camera 常见配置、调试等问题

时间:2021-01-12 15:59:44

工程使用Eclipse Mars+jni+Opencv,图像处理在jni里做。android只是抄过来用而已。

——————-配置部分———————
每次配置总会出现问题(查了众多资料崩了几天总结得来):
1、jre 库导入(编译java代码)
2、NDK路径和build path ${NDKROOT}/ndk-build.cmd (编译C、Cpp),调试需要再加上NDK_DEBUG=1
3、 C++\C path and symbols。其实就是jni查找include路径
4、Android的activity等类引入,一般可以自动修复
5、Android.mk的注意:
①Opencv.mk引入
②LOCAL_MODULE与LOCAL_SRC_FILES
③LOCAL_LDLIBS +=(严重注意 是+=还是冒号:,容易漏掉库
④APP_STL := gnustl_static 和 OPENCV_INSTALL_MODULES:=on后者可以使机器不用安装opencv manager,但是貌似编译起来变慢许多。
6、jni部分:
C不会自动强制转换,接口是C的写法。Cpp和C衔接注意extern “C”。另外C部分会出现各种怪异问题,比如size_t不识别(直接改unsigned int),部分宏定义(自己重写)找不到,引用头文件无效等等(比如float.h每次都出问题)。最奇葩的问题是因为eclipse不会默认强制转换,会提示unresolved symbol问题。比如我使用 fabs(a),a是一个int,他不会自动转换,而是提示fabs()这个函数找不到,误导性很大(我就rlgl),这时强制转换下fabs((double)a)就通过了。
7、引入opencv库..就是那个jar文件。听说opencv android的2.4.X最稳定。推荐X越高越好。3的不稳定。。反正我的3.1.0java都编不出来。

——————-OTG调用部分———————
下载的simplewebcam-master。可以自行git到。
可以参考http://www.eoeandroid.com/thread-252676-1-1.html?_dsign=44f35f3b

注意在修改权限的部分。
oncreate函数里调用自写函数。其实是网上抄的。
最初抄的版本里, Runtime runtime = Runtime.getRuntime(),没有新建一个对象,而是直接 process = Runtime.getRuntime().exec(“su”)。这种方法行不通。

    @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);


String apkRoot="chmod 666 /dev/video*";//SD卡分区路径,也可能是mmcblk1随系统版本定,当前程序路径请用getPackageCodePath();
//SystemManager.RootCommand(apkRoot);
RootCmd(apkRoot);

cp = (CameraPreview) findViewById(R.id.cp);
}

public boolean RootCmd(String cmd){
Process process = null;
DataOutputStream os = null;

Runtime runtime = Runtime.getRuntime();
try {
process = runtime.exec("su");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

try{
os = new DataOutputStream(process.getOutputStream());

os.writeBytes(cmd+ "\n");
os.flush();

os.writeBytes("exit\n");
os.flush();

process.waitFor();
} catch (Exception e) {
return false;
} finally {
try {
if (os != null) {
os.close();
}
process.destroy();
} catch (Exception e) {
}
}
return true;
}

另外有个UsbWebCamera的app,直接无视权限就能启用otg usb cam。可惜没找到源码。

——————-Opencv Mat 与Java Bitmap转换———————

            Mat src = new Mat();
Utils.bitmapToMat(bmp, src);
ReadBarcode(src.getNativeObjAddr());

注意,在使用bitmapToMat前一定要初始化mat,不然会提示mat==null错误。
另外java部分在调用opencv的任何函数前,应该等待opencv manger的加载完毕。
具体为使用BaseLoaderCallback等待其加载完毕,可以参opencv sample2 - mixed processing里面的这段(注意加载jni lib也是在opencv manager之后):

private BaseLoaderCallback  mLoaderCallback = new BaseLoaderCallback(this) {
@Override
public void onManagerConnected(int status) {
switch (status) {
case LoaderCallbackInterface.SUCCESS:
{
Log.i(TAG, "OpenCV loaded successfully");

**// Load native library after(!) OpenCV initialization**
System.loadLibrary("doproc");
mOpenCvCameraView.setMaxFrameSize(480, 640);
mOpenCvCameraView.enableView();
} break;
default:
{
super.onManagerConnected(status);
} break;
}
}
};

暂时总结这些吧。赶脚卡在这些问题上几天不写算法真是坑。
还是*靠谱。