OpenCV4Android:non-system libraries in linker flags: -lopencv_java错误的解决

最近搞之前的一份老代码,发现OpenCV到2.4.11之后,之前的mk文件不适用了,报一堆一堆的错误。

一是如前文所述,LOCAL_LDLIBS    += -lm -llog这一句+=绝不能错误的写成:=.另外,还会报这样一个错误:

Android NDK: WARNING: APP_PLATFORM android-17 is larger than android:minSdkVersion 16 in ./AndroidManifest.xml
Android NDK: WARNING:jni/Android.mk:ProcessImg: non-system libraries in linker flags: -lopencv_java
Android NDK:     This is likely to result in incorrect builds. Try using LOCAL_STATIC_LIBRARIES
Android NDK:     or LOCAL_SHARED_LIBRARIES instead to list the library dependencies of the
Android NDK:     current module
[armeabi-v7a] Compile++ thumb: ProcessImg <= DetectFace_JNI.cpp
jni/DetectFace_JNI.cpp: In function ‘_jstring* Java_org_yan_processlib_LibProcessImg_processIplImg(JNIEnv*, jobject, jintArray, int, int)‘:
jni/DetectFace_JNI.cpp:97:44: warning: converting ‘false‘ to pointer type for argument 2 of ‘jint* _JNIEnv::GetIntArrayElements(jintArray, jboolean*)‘ [-Wconversion-null]
  cbuf = env->GetIntArrayElements(buf, false);
                                            ^
jni/DetectFace_JNI.cpp: In function ‘_jstring* Java_org_yan_processlib_LibProcessImg_processStaticImg(JNIEnv*, jobject, jintArray, int, int)‘:
jni/DetectFace_JNI.cpp:131:44: warning: converting ‘false‘ to pointer type for argument 2 of ‘jint* _JNIEnv::GetIntArrayElements(jintArray, jboolean*)‘ [-Wconversion-null]
  cbuf = env->GetIntArrayElements(buf, false);
                                            ^
[armeabi-v7a] Compile++ thumb: ProcessImg <= copyToAssets.cpp
[armeabi-v7a] Compile++ thumb: ProcessImg <= detectFace.cpp
[armeabi-v7a] SharedLibrary  : libProcessImg.so
/Users/yanzi/work/android-ndk-r10d/toolchains/arm-linux-androideabi-4.8/prebuilt/darwin-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.8/../../../../arm-linux-androideabi/bin/ld: warning: hidden symbol ‘__aeabi_atexit‘ in /Users/yanzi/work/android-ndk-r10d/sources/cxx-stl/gnu-libstdc++/4.8/libs/armeabi-v7a/thumb/libgnustl_static.a(atexit_arm.o) is referenced by DSO /Users/yanzi/work/OpenCV-android-sdk/sdk/native/jni/../libs/armeabi-v7a/libopencv_java.so
[armeabi-v7a] Install        : libProcessImg.so => libs/armeabi-v7a/libProcessImg.so

尽管so文件生成了,也安装了,但是报一个non-system libraries in linker flags: -lopencv_java的错误,编译出来的so文件只有330KB左右,理论上这个so应该4.5M左右。运行知道发现找不到libopencv.so. 这是产生这个错误的mk文件:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

ifeq ("$(wildcard $(OPENCV_MK_PATH))","")
#try to load OpenCV.mk from default install location
#include $(TOOLCHAIN_PREBUILT_ROOT)/user/share/OpenCV/OpenCV.mk
include /Users/yanzi/work/OpenCV-android-sdk/sdk/native/jni/OpenCV.mk
else
include $(OPENCV_MK_PATH)
endif
LOCAL_LDLIBS    += -lm -llog
LOCAL_MODULE    := ProcessImg
LOCAL_SRC_FILES := DetectFace_JNI.cpp 					src/copyToAssets.cpp 					src/detectFace.cpp

include $(BUILD_SHARED_LIBRARY)

正确的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))","")
#try to load OpenCV.mk from default install location
#include $(TOOLCHAIN_PREBUILT_ROOT)/user/share/OpenCV/OpenCV.mk
include /Users/yanzi/work/OpenCV-android-sdk/sdk/native/jni/OpenCV.mk
else
include $(OPENCV_MK_PATH)
endif

LOCAL_MODULE    := ProcessImg
LOCAL_SRC_FILES := DetectFace_JNI.cpp 					src/copyToAssets.cpp 					src/detectFace.cpp

LOCAL_LDLIBS    += -lm -llog
include $(BUILD_SHARED_LIBRARY)

问题就出在:

OpenCV_INSTALL_MODULES:=on
OPENCV_CAMERA_MODULES:=off
OPENCV_LIB_TYPE:=STATIC

这三句话,尤其是OPENCV_LIB_TYPE:=STATIC是要害,没这一句编译出来的so还是要依赖libopencv_java.so的。而且这句话必须放在include OpenCV.mk文件之前。切记切记!

欢迎加入OpenCV4Android 3群:272250397 备注:yanzi

时间: 2024-10-12 08:39:02

OpenCV4Android:non-system libraries in linker flags: -lopencv_java错误的解决的相关文章

Other Linker Flags

原文出自:http://alloc.sinaapp.com/wp/?p=272 一.关于Other Linker Flags xcode中,在“Targets”选项下有Other Linker Flags选项,在这里可以填写xcode链接器的参数,如:-ObjC.-all_load.-force_load等. 二.xcode链接器 xcode采用的链接器为ld–GNU,ld是GNU工具链中的一个软件,主要用于将obj文件连接成可执行文件.同时你能使用自己的脚本来控制ld的行为,这是你可以通过-T

XCODE:&lt;iOS&gt;other linker flags

在工程中导入XMPP第三库时,出现link错误,错误如下: Undefined symbols for architecture i386: "_iconv", referenced from: _mem_cd_iconv in libidn.a(striconv.o) _str_cd_iconv in libidn.a(striconv.o) (maybe you meant: _str_iconv, _str_cd_iconv , _mem_cd_iconv ) "_ic

关于Xcode的Other Linker Flags

背景 在ios开发过程中,有时候会用到第三方的静态库(.a文件),然后导入后发现编译正常但运行时会出现selector not recognized的错误,从而导致app闪退.接着仔细阅读库文件的说明文档,你可能会在文档中发现诸如在Other Linker Flags中加入-ObjC或者-all_load这样的解决方法. 那么,Other Linker Flags到底是用来干什么的呢?还有-ObjC和-all_load到底发挥了什么作用呢? 链接器 首先,要说明一下Other Linker Fl

Xcode 编辑器之关于Other Linker Flags相关问题

一,概述 问题场景一 当从网上去下载一些之前的完整的项目的时候,用终端也 pod update了,但一运行,熟悉的linker错误就出来了. 解决办法 在Other Linker Flags(也即 OTHER_LDFLAGS)中添加$(inherited). 在Header/Framework Search Paths(也即HEADER_SEARCH_PATHS和FRAMEWORK_SEARCH_PATHS) 添加$(PODS_ROOT)/Headers. 问题场景二 当从网上下载第三方类库拉到

&lt;iOS&gt;关于Xcode上的Other linker flags

<iOS>关于Xcode上的Other linker flags Targets选项下有Other linker flags的设置,用来填写XCode的链接器参数,如:-ObjC -all_load -force_load等.还记得我们在学习C程序的时候,从C代码到可执行文件经历的步骤是:源代码 > 预处理器 > 编译器 > 汇编器 > 机器码 > 链接器 > 可执行文件在最后一步需要把.o文件和C语言运行库链接起来,这时候需要用到ld命令.源文件经过一系列

Targets选项下有Other linker flags的设置

Targets选项下有Other linker flags的设置,用来填写XCode的链接器参数,如:-ObjC -all_load -force_load -allod等. 下面逐个介绍3个常用参数:-ObjC:加了这个参数后,链接器就会把静态库中所有的Objective-C类和分类都加载到最后的可执行文件中-all_load:会让链接器把所有找到的目标文件都加载到可执行文件中,但是千万不要随便使用这个参数!假如你使用了不止一个静态库文件,然后又使用了这个参数,那么你很有可能会遇到ld: du

xcode:关于Other Linker Flags

http://blog.csdn.net/tammy_min/article/details/12854595 三.主要参数 这里要说的主要参数是ld工具的参数,也是在Other Linker Flags里常用到的参数. 1.-ObjC 当使用ObjC写的静态类别库(Objective-C static library that contains categories),在程序编译链接时,如果不在Other Linker Flags中填写-ObjC,往往会报错,出现"selector not r

iOS 关于Xcode上的Other linker flags

博客来源  http://www.cnblogs.com/robinkey/archive/2013/05/27/3101095.html Targets选项下有Other linker flags的设置,用来填写XCode的链接器参数,如:-ObjC -all_load -force_load等.还记得我们在学习C程序的时候,从C代码到可执行文件经历的步骤是:源代码 > 预处理器 > 编译器 > 汇编器 > 机器码 > 链接器 > 可执行文件在最后一步需要把.o文件和

iOS other linker flags

我是写swift项目的,引入了腾讯云视频的SDK,录制视频,播放视频都正常,但是一点击上传视频,app就crash掉了. 当时项目是在Xcode7下运行,报的错就一句话: libc++abi.dylib: terminating with uncaught exception of type NSException . 只有这句话,在没有任何详细的报错信息下,我把代码断点后,也一直发现不了原因.跟腾讯的技术支持交流,那个人他说他也是第一次见这种错误,最后说可能是oc与swift混编的问题,叫我用