未能构建opencv jni示例-opencv示例-本机活动(未定义引用)



我试图构建一个OpenCV JNI示例(本机活动)。我删除了大部分java内容(我只想尝试一些OpenCVJNI)。

我在c/c++通用->路径和符号->GNU c++中添加了路径(抱歉不能发布截图)

${NDKROOT}/sources/cxx-stl/gnu-libstdc++/4.6/include
${NDKROOT}/sources/cxx-stl/gnu-libstdc++/4.6/libs/armeabi-v7a/include
${NDKROOT}/sources/android/native_app_glue
${NDKROOT}/platforms/android-19/arch-arm/usr/include
C:AndroidDevelopmentOpenCV-2.4.7-android-sdksdknativejniinclude

我的Android.mk文件:

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
include C:/Android/Development/OpenCV-2.4.7-android-sdk/sdk/native/jni/OpenCV.mk
LOCAL_MODULE    := native_activity
LOCAL_SRC_FILES := native.cpp
LOCAL_LDLIBS    += -lm -llog -landroid
LOCAL_STATIC_LIBRARIES += android_native_app_glue
include $(BUILD_SHARED_LIBRARY)

$(call import-module,android/native_app_glue)

应用程序.mk:

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

当我试图构建程序时,我得到以下错误消息:

C:AndroidDevelopmentandroid-ndk-r9bndk-build.cmd 
Android NDK: WARNING: APP_PLATFORM android-19 is larger than android:minSdkVersion 9 in             ./AndroidManifest.xml    
[armeabi-v7a] Gdbserver      : [arm-linux-androideabi-4.6] libs/armeabi-v7a/gdbserver
[armeabi-v7a] Gdbsetup       : libs/armeabi-v7a/gdb.setup
[armeabi-v7a] SharedLibrary  : libnative_activity.so
C:/Android/Development/android-ndk-r9b/toolchains/arm-linux-androideabi-    4.6/prebuilt/windows-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-    androideabi/bin/ld.exe: ./obj/local/armeabi-v7a/objs-debug/native_activity/native.o: in     function cv::Mat::~Mat():C:/Android/Development/OpenCV-2.4.7-android-    sdk/sdk/native/jni/include/opencv2/core/mat.hpp:278: error: undefined reference to     'cv::fastFree(void*)'
C:/Android/Development/android-ndk-r9b/toolchains/arm-linux-androideabi-    4.6/prebuilt/windows-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-    androideabi/bin/ld.exe: ./obj/local/armeabi-v7a/objs-debug/native_activity/native.o: in     function cv::Mat::release():C:/Android/Development/OpenCV-2.4.7-android-    sdk/sdk/native/jni/include/opencv2/core/mat.hpp:367: error: undefined reference to     'cv::Mat::deallocate()'
C:/Android/Development/android-ndk-r9b/toolchains/arm-linux-androideabi-    4.6/prebuilt/windows-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-    androideabi/bin/ld.exe: ./obj/local/armeabi-v7a/objs-debug/native_activity/native.o: in     function android_main:jni/native.cpp:214: error: undefined reference to 'cv::getTickCount()'
C:/Android/Development/android-ndk-r9b/toolchains/arm-linux-androideabi-    4.6/prebuilt/windows-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld.exe: ./obj/local/armeabi-v7a/objs-debug/native_activity/native.o: in function android_main:jni/native.cpp:226: error: undefined reference to     'cv::putText(cv::Mat&, std::string const&, cv::Point_<int>, int, double,     cv::Scalar_<double>, int, int, bool)'
C:/Android/Development/android-ndk-r9b/toolchains/arm-linux-androideabi-4.6/prebuilt/windows-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-    androideabi/bin/ld.exe: ./obj/local/armeabi-v7a/objs-debug/native_activity/native.o: in     function android_main:jni/native.cpp:238: error: undefined reference to     'cv::getTickFrequency()'
C:/Android/Development/android-ndk-r9b/toolchains/arm-linux-androideabi-4.6/prebuilt/windows-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-linux-androideabi/bin/ld.exe: ./obj/local/armeabi-v7a/objs-debug/native_activity/native.o: in function cv::Ptr<cv::VideoCapture>::release():C:/Android/Development/OpenCV-2.4.7-android-sdk/sdk/native/jni/include/opencv2/core/operations.hpp:2604: error: undefined reference to 'cv::fastFree(void*)'
collect2: ld returned 1 exit status
make.exe: *** [obj/local/armeabi-v7a/libnative_activity.so] Error 1
**** Build Finished ****

详细输出:

Android NDK: WARNING: APP_PLATFORM android-19 is larger than android:minSdkVersi
on 9 in ./AndroidManifest.xml
del /f/q .libsarmeabi-v7agdbserver   >NUL 2>NUL
del /f/q .libsarmeabi-v7agdb.setup   >NUL 2>NUL
[armeabi-v7a] Gdbserver      : [arm-linux-androideabi-4.6] libs/armeabi-v7a/gdbs
erver
copy /b/y "C:AndroidDevelopmentandroid-ndk-r9bprebuiltandroid-armgdbserver
gdbserver" ".libsarmeabi-v7agdbserver" > NUL
[armeabi-v7a] Gdbsetup       : libs/armeabi-v7a/gdb.setup
C:/Android/Development/android-ndk-r9b/prebuilt/windows-x86_64/bin/echo.exe "set
 solib-search-path ./obj/local/armeabi-v7a" > ./libs/armeabi-v7a/gdb.setup
C:/Android/Development/android-ndk-r9b/prebuilt/windows-x86_64/bin/echo.exe "dir
ectory C:/Android/Development/android-ndk-r9b/platforms/android-19/arch-arm/usr/
include C:/Android/Development/android-ndk-r9b/sources/android/native_app_glue C
:/Android/Development/android-ndk-r9b/sources/cxx-stl/gnu-libstdc++ "C:/Android/
Development/OpenCV-2.4.7-android-sdk/sdk/native/jni/include/opencv" "C:/Android/
Development/OpenCV-2.4.7-android-sdk/sdk/native/jni/include" C:/Android/Developm
ent/android-ndk-r9b/sources/cxx-stl/gnu-libstdc++/4.6/include C:/Android/Develop
ment/android-ndk-r9b/sources/cxx-stl/gnu-libstdc++/4.6/libs/armeabi-v7a/include
C:/Android/Development/android-ndk-r9b/sources/cxx-stl/gnu-libstdc++/4.6/include
/backward" >> ./libs/armeabi-v7a/gdb.setup
[armeabi-v7a] SharedLibrary  : libnative_activity.so
C:/Android/Development/android-ndk-r9b/toolchains/arm-linux-androideabi-4.6/preb
uilt/windows-x86_64/bin/arm-linux-androideabi-g++ -Wl,-soname,libnative_activity
.so -shared --sysroot=C:/Android/Development/android-ndk-r9b/platforms/android-1
9/arch-arm ./obj/local/armeabi-v7a/objs-debug/native_activity/native.o ./obj/loc
al/armeabi-v7a/libandroid_native_app_glue.a C:/Android/Development/android-ndk-r
9b/sources/cxx-stl/gnu-libstdc++/4.6/libs/armeabi-v7a/libgnustl_static.a -lgcc -
no-canonical-prefixes -march=armv7-a -Wl,--fix-cortex-a8  -Wl,--no-undefined -Wl
,-z,noexecstack -Wl,-z,relro -Wl,-z,now  -LC:/Android/Development/android-ndk-r9
b/platforms/android-19/arch-arm/usr/lib -lm -llog -landroid -llog -lc -lm -o ./o
bj/local/armeabi-v7a/libnative_activity.so
C:/Android/Development/android-ndk-r9b/toolchains/arm-linux-androideabi-4.6/preb
uilt/windows-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-lin
ux-androideabi/bin/ld.exe: ./obj/local/armeabi-v7a/objs-debug/native_activity/na
tive.o: in function cv::Mat::~Mat():C:/Android/Development/OpenCV-2.4.7-android-
sdk/sdk/native/jni/include/opencv2/core/mat.hpp:278: error: undefined reference
to 'cv::fastFree(void*)'
C:/Android/Development/android-ndk-r9b/toolchains/arm-linux-androideabi-4.6/preb
uilt/windows-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-lin
ux-androideabi/bin/ld.exe: ./obj/local/armeabi-v7a/objs-debug/native_activity/na
tive.o: in function cv::Mat::release():C:/Android/Development/OpenCV-2.4.7-andro
id-sdk/sdk/native/jni/include/opencv2/core/mat.hpp:367: error: undefined referen
ce to 'cv::Mat::deallocate()'
C:/Android/Development/android-ndk-r9b/toolchains/arm-linux-androideabi-4.6/preb
uilt/windows-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-lin
ux-androideabi/bin/ld.exe: ./obj/local/armeabi-v7a/objs-debug/native_activity/na
tive.o: in function android_main:jni/native.cpp:214: error: undefined reference
to 'cv::getTickCount()'
C:/Android/Development/android-ndk-r9b/toolchains/arm-linux-androideabi-4.6/preb
uilt/windows-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-lin
ux-androideabi/bin/ld.exe: ./obj/local/armeabi-v7a/objs-debug/native_activity/na
tive.o: in function android_main:jni/native.cpp:226: error: undefined reference
to 'cv::putText(cv::Mat&, std::string const&, cv::Point_<int>, int, double, cv::
Scalar_<double>, int, int, bool)'
C:/Android/Development/android-ndk-r9b/toolchains/arm-linux-androideabi-4.6/preb
uilt/windows-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-lin
ux-androideabi/bin/ld.exe: ./obj/local/armeabi-v7a/objs-debug/native_activity/na
tive.o: in function android_main:jni/native.cpp:238: error: undefined reference
to 'cv::getTickFrequency()'
C:/Android/Development/android-ndk-r9b/toolchains/arm-linux-androideabi-4.6/preb
uilt/windows-x86_64/bin/../lib/gcc/arm-linux-androideabi/4.6/../../../../arm-lin
ux-androideabi/bin/ld.exe: ./obj/local/armeabi-v7a/objs-debug/native_activity/na
tive.o: in function cv::Ptr<cv::VideoCapture>::release():C:/Android/Development/
OpenCV-2.4.7-android-sdk/sdk/native/jni/include/opencv2/core/operations.hpp:2604
: error: undefined reference to 'cv::fastFree(void*)'
collect2: ld returned 1 exit status
make.exe: *** [obj/local/armeabi-v7a/libnative_activity.so] Error 1

当我删除对opencv函数的调用时,错误会消失

对我来说,链接器似乎有问题,但我不知道如何解决它。谢谢你的帮助!

试试这个代码。

OPENCV_INSTALL_MODULES:=on
OPENCV_LIB_TYPE:=STATIC
include ../../sdk/native/jni/OpenCV.mk

我不确定它是否有效,但值得一试。

我想从Sohyun的回答中添加一些信息。在添加代码之前

OPENCV_INSTALL_MODULES:=on
OPENCV_LIB_TYPE:=STATIC
include ../../sdk/native/jni/OpenCV.mk

请确保您的代码在Opencv4android的文件夹中。这意味着你可以在../..中找到OpenCV.mk/sdk/native/jni/OpenCV.mk。当然,如果你能在那里找到OpenCV.mk,你可以将"../../sdk/native/jni/OpenCV.mk"更改为其他路径。

我通过重新安装Cygwin解决了这个问题并再次构建项目

构建项目的步骤

Setp 1.转到已安装的Cygwin目录。(通常在C:\Cygwin上)运行Cygwin.bat文件

步骤2.在cygwing命令窗口中输入以下命令

cd/cygdrive/您的项目根目录

例如,如果你的项目位于e:\Projects\NdkSample,你必须输入

cd /cygdrive/e/Projects/NdkSample

步骤3.现在我们需要运行ndk-build命令,打开NDK文件夹并运行NDK-build命令,在我的情况下,它位于E:\NDK\android-NDK-r10/NDK-build-中

按照以下运行命令

/cygdrive/e/Android-SDK/Android/NDK/android-ndk-r10/ndk-build

我也有类似的错误。在我的情况下,我已经下载了windows-x86_64的ndk。某些ndk调用中的路径不正确。我必须重命名以下文件夹:

  1. /android-nkd-r10b/预构建/android-arm64-->/android-nkd-r10b/预构建/android arm
  2. /android-nkd-r10b/预构建/android-mips64-->/android-nkd-r10b/预构建/android mips
  3. /android-nkd-r10b/预构建/android-x86_64-->/android-nkd-r10b/预构建/android-x86

您必须启用NDK-LOG才能看到路径错误的NDK调用!

相关内容

最新更新