AndroidScannerDemo移植总结

    xiaoxiao2025-09-10  529

    前言

    最近项目里要用到AndroidScannerDemo的效果,在移植的过程中遇到一些问题,在这里进行一个整理。

    移植过程

    主要应该是Android.mk和Application.mk的移植

    这个两个文件应该是涉及到jni的时候都会用到的,里面有一些配置信息。下面我附上原项目的文件和我最终的文件。 AndroidScannerDemo 中Android.mk

    LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) OPENCV_INSTALL_MODULES:=on include sdk/native/jni/OpenCV.mk LOCAL_MODULE := Scanner LOCAL_SRC_FILES := scan.cpp LOCAL_LDLIBS += -lm -llog -landroid LOCAL_LDFLAGS += -ljnigraphics include $(BUILD_SHARED_LIBRARY)

    移植后我的Android.mk

    LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) OpenCV_INSTALL_MODULES := on OpenCV_CAMERA_MODULES := off OPENCV_LIB_TYPE :=STATIC ifeq ("$(wildcard $(OPENCV_MK_PATH))","") include F:\我的工程目录\library\native\jni\OpenCV.mk //这里native文件夹的位置我换过了,换到根目录里面了 else include $(OPENCV_MK_PATH) endif LOCAL_MODULE := Scanner LOCAL_SRC_FILES := scan.cpp LOCAL_LDLIBS += -lm -llog -ljnigraphics include $(BUILD_SHARED_LIBRARY)

    这个配置是从OpenCV4Android释疑: 透析Android以JNI调OpenCV的三种方式(让OpenCVManager永不困扰)里面来的,使用的是里面的第一种方式,静态加载的方式(其实如果只是想移植AndroidScannerDemo的话,不需要我这么写,我这么写主要是为了减少包的大小,之前的时候只适配armeabi-v7a的话,安装包大小有5m多,现在是2m多,感觉应该能更小一些,只是还没找到方法。)。里面有一些参数的解释,OpenCV_INSTALL_MODULES:=on的意思是自动将依赖的OpenCV的so库拷贝到libs目录下,但很遗憾的是,这个命令只对OPENCV_CAMERA_MODULES有效。只有当OPENCV_CAMERA_MODULES:=on时,可以看到他会自动将里面的带camera的so拷贝至工程下的libs文件夹下。 这里我有个问题是,按照这种解释,那么上面的OpenCV_INSTALL_MODULES:=on好像没有意义,不清楚里面是不是还有一些其他考虑。LOCAL_MODULE 是要生成的库的名字,LOCAL_SRC_FILES 是jni文件夹下的cpp文件。有一个要注意的是LOCAL_LDLIBS ,这个后面有一个-ljnigraphics,这个是要加上的,而且是要和gradle配合 在gradle的defaultConfig中要加上下面这一段

    ndk { moduleName "Scanner" ldLibs "jnigraphics"//在opencv里起到导入这个包的作用,不然会提示Bitmap这个类找不到 }

    AndroidScannerDemo 中Application.mk

    APP_STL := stlport_static APP_CPPFLAGS := -frtti -fexceptions APP_ABI := armeabi-v7a APP_PLATFORM := android-14

    移植后我的Application.mk

    APP_STL := gnustl_static APP_CPPFLAGS := -frtti -fexceptions APP_ABI := armeabi-v7a APP_PLATFORM := android-14

    这两个差别只在APP_STL的值,一个是stlport_static一个是gnustl_static。区别是stlport_static - 使用STLport作为静态库,gnustl_static - 使用 GNU libstdc++ 作为静态库。这里我不太清楚两者的具体差别,只是看到有说GNU libstdc++相比较而言会生成的问价体积大一些,运行效率低一些,但这里如果不用gnustl_static的话编译时会报错,各种找不到类。

    javah命令

    把代码拿过来之后,如果想要进行javah命令,可能有的人会发现有错,比如报Bitmap找不到之类的。这里把我现在的javah命令贴出来,我的是用android studio的External Tools生成的一个工具,里面Parameters的值为

    -classpath D:\Develop\Android\Sdk\platforms\android-24\android.jar;. -jni -d $ModuleFileDir$\src\main\jni $FileClass$
    转载请注明原文地址: https://ju.6miu.com/read-1302490.html
    最新回复(0)