我试图构建一个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调用中的路径不正确。我必须重命名以下文件夹:
- /android-nkd-r10b/预构建/android-arm64-->/android-nkd-r10b/预构建/android arm
- /android-nkd-r10b/预构建/android-mips64-->/android-nkd-r10b/预构建/android mips
- /android-nkd-r10b/预构建/android-x86_64-->/android-nkd-r10b/预构建/android-x86
您必须启用NDK-LOG才能看到路径错误的NDK调用!