手写选择题识别-实现android调用c++ oepncv项目

本文介绍了如何在Android应用中通过JNI调用C++ OpenCV库实现选择题识别。首先讲解了JNI的基本概念,然后详细阐述了配置Android.mk和Application.mk文件,以及如何处理头文件和cpp文件。在遇到错误和问题时,作者逐步解决,包括环境变量配置、SO文件生成和加载,以及在C++代码中调用OpenCV函数。最终实现了通过Java调用C++代码完成图像处理任务。
摘要由CSDN通过智能技术生成

首先学习jni的基础:
参考深入理解android1:

jni = java native interface 即java 本地调用。本来java是一个跨平台的玩意,但是实际上到了不同的平台都需要调用本地,这样如果中间有这样的一个接口,java 和 native之间可以这样通信,就真正实现了跨平台。

jni实际上是一门技术,可以实现 java调用c或c++的函数(native),也可以实现c++程序中调用java函数。
之间的关系就是有一层jni连通java和c++。
这里写图片描述

懂了这个之后,就是说要将两者建立连接,注册好让两者知道。然后就是两者之间的语言的转换。

opencv4android里面自带的native 有这样jni一个文件夹,里面有很多的abi-xxxx 架构文件,这些最好是单个加入配置文件里面去,然后再编译另一个。不同的不会出现覆盖现象,不要尝试 一次性 APP-Bi = :ALL
这里写图片描述

里面同样的有一个文件是opencv.mk文件,这个是需要的,是在 android.mk 脚本文件中要引入 opencv C++库所要参照的文件。虽然看不懂,但是能够打开,先大致看看内容。
这里写图片描述

在哪里有android.mk文件呢?
在jni文件夹(这个就是放置javah生成.h的头文件和cpp文件的文件夹)中 新建一个文件 名为android.mk(后面选择了一个打开方式为txt)。

这里写图片描述
这里写图片描述

有一个地方是添加opencv的路径的,很多是写没有导入进来的绝对路径,而我们现在已经导入进来 了 ,所以想着添加为相对路径。
需要改变的:


include ..\..\..\..\native\jni\OpenCV.mk
这个module名字表示编译出的.so文件名字
LOCAL_MODULE := HandWrtiterReg
LOCAL_SRC_FILES 后面添加一些需要编译的jni下的cpp源文件。多个 是以 \隔开?

LOCAL_SRC_FILES := com_example_yanguokai_handerwriterreg_CHandWriterReg.cpp  

这两个不知道加不加
OPENCV_CAMERA_MODULES:=on
OPENCV_INSTALL_MODULES:=on
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
OPENCV_LIB_TYPE:=STATIC
ifeq ("$(wildcard $(OPENCV_MK_PATH))","")

include ..\..\..\..\native\jni\OpenCV.mk
else
include $(OPENCV_MK_PATH)
endif
OPENCV_CAMERA_MODULES:=on
OPENCV_INSTALL_MODULES:=on

LOCAL_MODULE := ImgFun
LOCAL_SRC_FILES := ImgFun.cpp
LOCAL_LDLIBS += -lm -llog
include $(BUILD_SHARED_LIBRARY)

同样建立对Application.mk文件。

APP_STL := gnustl_static
APP_CPPFLAGS := -frtti -fexceptions
APP_ABI := armeabi-v7a       #这句是设置生成的cpu指令类型,提示,目前绝大部分安卓手机支持armeabi,libs下太多类型,编译进去 apk 包会过大
APP_PLATFORM := android-18   #这句是设置最低安卓平台,和min-sdk一致

有人说要配置这个local配置文件,将ndk.dir添加进去,也有人没有配置,始终不放心,所以打开看了一下啊。发现本身就有,那就可能是通过可视化界面添加ndk时自动添加的,另外还提示说不用更改这个文件。
这里写图片描述

同样的还有一个文件,同上。
这里写图片描述

这些都不用管了。

剩下的就是cpp文件如何修改 了。我现在只知道要实现头文件中的接口函数,以及对java 和native中相应的转换。我可以只写一两个接口,然后再调用我原来正常的c++函数吗?听说 还要全部放到extend “c”{}括号里面。

嗯,应该是要放在括号里。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值