2017-05-29 73 views
1

我是Android新手,所以我不完全了解如何制作Android.mk文件。 我的项目运行正常,在线提供了Android.mk的教程。但后来我需要添加一个缺失的库,并且该教程有另一个Android.mk,现在我试图将它们合并在一起。如何在添加库时合并两个Android.mk文件?

这里是我的Android.mk:

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 

#opencv 
OPENCVROOT:= C:\OpenCV-2.4.10-android-sdk 
OPENCV_CAMERA_MODULES:=on 
OPENCV_INSTALL_MODULES:=on 
OPENCV_LIB_TYPE:=SHARED 
include ${OPENCVROOT}/sdk/native/jni/OpenCV.mk 

LOCAL_SRC_FILES := com_example_adrien_ndkopencvtest4_OpencvNativeClass.cpp 


LOCAL_LDLIBS += -llog 

LOCAL_MODULE := MyOpencvLibs 


include $(BUILD_SHARED_LIBRARY) 

这里是Android.mk我需要添加:

LOCAL_PATH := $(call my-dir) 
OPENCV_PATH := D:/CODE/OpenCV-2.4.10-android-sdk/sdk/native/jni 

include $(CLEAR_VARS) 
LOCAL_MODULE := nonfree 
LOCAL_SRC_FILES := libnonfree.so 
include $(PREBUILT_SHARED_LIBRARY) 

include $(CLEAR_VARS) 
OPENCV_INSTALL_MODULES := on 
OPENCV_CAMERA_MODULES := off 
include $(OPENCV_PATH)/OpenCV.mk 

LOCAL_C_INCLUDES :=    \ 
    $(LOCAL_PATH)    \ 
    $(OPENCV_PATH)/include 

LOCAL_SRC_FILES :=    \ 
    nonfree_jni.cpp 

LOCAL_MODULE := nonfree_demo 
LOCAL_CFLAGS := -Werror -O3 -ffast-math 
LOCAL_LDLIBS := -llog -ldl 
LOCAL_SHARED_LIBRARIES += nonfree 

include $(BUILD_SHARED_LIBRARY) 

我感兴趣的东西,在过去的Android .mk只是libnonfree.so,我不需要cpp文件。

这里是我的项目的结构:

enter image description here

编辑:

谢谢您的回答。我已经做了什么建议和我的Android.mk看起来像这样:

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

#opencv 
OPENCVROOT:= C:\OpenCV-2.4.10-android-sdk 
OPENCV_CAMERA_MODULES:=on 
OPENCV_INSTALL_MODULES:=on 
OPENCV_LIB_TYPE:=SHARED 
include ${OPENCVROOT}/sdk/native/jni/OpenCV.mk 

LOCAL_SRC_FILES := com_example_adrien_ndkopencvtest4_OpencvNativeClass.cpp 
LOCAL_LDLIBS += -llog 
LOCAL_SHARED_LIBRARIES += nonfree 
LOCAL_MODULE := MyOpencvLibs 
include $(BUILD_SHARED_LIBRARY) 

include $(CLEAR_VARS) 
LOCAL_MODULE := nonfree 
LOCAL_SRC_FILES := libnonfree.so 
include $(PREBUILT_SHARED_LIBRARY) 

但问题依然存在。我有“未定义的参考”方法libnonfree.so应该添加。我认为问题来自Android.mk,但也许是从其他地方。

我添加System.loadLibrary("nonfree");MainACtivity

#include "opencv2/nonfree/nonfree.hpp" 
#include "opencv2/nonfree/features2d.hpp" 

我不知道我做错了。

编辑2:

以下是错误:

Application.mk:

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

我不知道在哪里设置arguments="V=1"在我的build.gradle

我的建设。的gradle:

apply plugin: 'com.android.application' 

android { 
    compileSdkVersion 25 
    buildToolsVersion "25.0.2" 
    defaultConfig { 
     applicationId "com.example.adrien.ndkopencvtest4" 
     minSdkVersion 15 
     targetSdkVersion 25 
     versionCode 1 
     versionName "1.0" 
     testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 
    } 

    sourceSets.main { 
     //jniLibs.srcDirs = ['src/main/jniLibs'] 
     jni.srcDirs = [] //disable automatic ndk-build call 
    } 
    task ndkBuild(type: Exec, description: 'Compile JNI source via NDK') { 
     commandLine "C:/Users/Adrien/AppData/Local/Android/sdk/ndk-bundle/ndk-build.cmd", 
       'NDK_PROJECT_PATH=build/intermediates/ndk', 
       'NDK_LIBS_OUT=src/main/jniLibs', 
       'APP_BUILD_SCRIPT=src/main/jni/Android.mk', 
       'NDK_APPLICATION_MK=src/main/jni/Application.mk' 
    } 
    tasks.withType(JavaCompile) { 
     compileTask -> compileTask.dependsOn ndkBuild 
    } 
    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 
} 

dependencies { 
    compile fileTree(include: ['*.jar'], dir: 'libs') 
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { 
     exclude group: 'com.android.support', module: 'support-annotations' 
    }) 
    compile 'com.github.wseemann:FFmpegMediaMetadataRetriever-armeabi-v7a:1.0.14' 
    compile 'com.android.support:appcompat-v7:25.3.1' 
    compile 'com.android.support.constraint:constraint-layout:1.0.2' 
    testCompile 'junit:junit:4.12' 
    compile project(':openCVLibrary2410') 

} 

EDIT 3: “NDK建造V = 1” 的

结果:

C:\Users\Adrien\AndroidStudioProjects\NDKOpencvTest4\app\src\main\jni>ndk-build V=1 

[armeabi-v7a] SharedLibrary : libMyOpencvLibs.so 
C:/Users/Adrien/AppData/Local/Android/sdk/ndk-bundle/build//../toolchains/llvm/preb 
uilt/windows-x86_64/bin/clang++.exe -Wl,-soname,libMyOpencvLibs.so -shared --sysroo 
t=C:/Users/Adrien/AppData/Local/Android/sdk/ndk-bundle/build//../platforms/android- 
16/arch-arm C:/Users/Adrien/AndroidStudioProjects/NDKOpencvTest4/app/src/main/obj/l 
ocal/armeabi-v7a/objs/MyOpencvLibs/com_example_adrien_ndkopencvtest4_OpencvNativeCl 
ass.o C:/Users/Adrien/AppData/Local/Android/sdk/ndk-bundle/build//../sources/cxx-st 
l/gnu-libstdc++/4.9/libs/armeabi-v7a/libgnustl_static.a -lgcc C:/Users/Adrien/Andro 
idStudioProjects/NDKOpencvTest4/app/src/main/obj/local/armeabi-v7a/libopencv_java.s 
o C:/Users/Adrien/AndroidStudioProjects/NDKOpencvTest4/app/src/main/obj/local/armea 
bi-v7a/libnonfree.so -gcc-toolchain C:/Users/Adrien/AppData/Local/Android/sdk/ndk- 
bundle/build//../toolchains/arm-linux-androideabi-4.9/prebuilt/windows-x86_64 -no-c 
anonical-prefixes -target armv7-none-linux-androideabi -Wl,--fix-cortex-a8 -Wl,--b 
uild-id -Wl,--no-undefined -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now -Wl,--warn-sh 
ared-textrel -Wl,--fatal-warnings -LC:/Users/Adrien/AppData/Local/Android/sdk/ndk 
-bundle/build//../platforms/android-16/arch-arm/usr/lib -llog -lc -lm -o C:/Users/A 
drien/AndroidStudioProjects/NDKOpencvTest4/app/src/main/obj/local/armeabi-v7a/libMy 
OpencvLibs.so 
C:/Users/Adrien/AndroidStudioProjects/NDKOpencvTest4/app/src/main/jni/com_example_a 
drien_ndkopencvtest4_OpencvNativeClass.cpp:214: error: undefined reference to 'cv:: 
SURF::SURF(double, int, int, bool, bool)' 
C:/Users/Adrien/AndroidStudioProjects/NDKOpencvTest4/app/src/main/jni/com_example_a 
drien_ndkopencvtest4_OpencvNativeClass.cpp:222: error: undefined reference to 'cv:: 
SURF::SURF()' 
C:/Users/Adrien/AndroidStudioProjects/NDKOpencvTest4/app/src/main/jni/com_example_a 
drien_ndkopencvtest4_OpencvNativeClass.cpp:204: error: undefined reference to 'VTT 
for cv::SURF' 
C:/Users/Adrien/AndroidStudioProjects/NDKOpencvTest4/app/src/main/jni/com_example_a 
drien_ndkopencvtest4_OpencvNativeClass.cpp:204: error: undefined reference to 'VTT 
for cv::SURF' 
C:/Users/Adrien/AndroidStudioProjects/NDKOpencvTest4/app/src/main/jni/com_example_a 
C:/Users/Adrien/AndroidStudioProjects/NDKOpencvTest4/app/src/main/jni/com_example_adrien_ndkopencvtest4_OpencvNativeClass.cpp:204: error: undefined 
reference to 'VTT for cv::SURF' 
C:/Users/Adrien/AndroidStudioProjects/NDKOpencvTest4/app/src/main/jni/com_example_adrien_ndkopencvtest4_OpencvNativeClass.cpp:449: error: undefined 
reference to 'cv::SURF::SURF(double, int, int, bool, bool)' 
C:/Users/Adrien/AndroidStudioProjects/NDKOpencvTest4/app/src/main/jni/com_example_adrien_ndkopencvtest4_OpencvNativeClass.cpp:457: error: undefined 
reference to 'cv::SURF::SURF()' 
clang++.exe: error: linker command failed with exit code 1 (use -v to see invocation) 
make: *** [C:/Users/Adrien/AndroidStudioProjects/NDKOpencvTest4/app/src/main/obj/local/armeabi-v7a/libMyOpencvLibs.so] Error 1 

SOLUTION:

我libnonfree。所以文件不正确,我下载了一个另一个。我也改变了我的Application.mk文件:

APP_STL := gnustl_static 
APP_CPPFLAGS := -frtti -fexceptions 
APP_ABI := armeabi-v7a 
APP_PLATFORM := android-16 
+0

请显示您看到的错误。为了理解你的** Android.mk **是如何解释的,从命令行运行'ndk-build V = 1'(或者你可以在** build.gradle **文件中设置arguments =“V = 1”'' )。请注意,您应该非常小心您的** Application.mk **文件的内容。并确保您的APK仅构建** armeabi-v7a **,因为您没有针对其他ABI的** libnonfree.so **。 –

+0

我编辑了我的答案,谢谢你的时间。 – Megatron300

+0

你有这个'commandLine'字符串。添加''V = 1''作为其论据之一。 –

回答

1

如果你想预构建的共享库添加到项目中,你并不需要一个单独的Android.mk

让我们把你的脚本,

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 

#opencv 
OPENCVROOT:= C:\OpenCV-2.4.10-android-sdk 
OPENCV_CAMERA_MODULES:=on 
OPENCV_INSTALL_MODULES:=on 
OPENCV_LIB_TYPE:=SHARED 
include ${OPENCVROOT}/sdk/native/jni/OpenCV.mk 

LOCAL_SRC_FILES := com_example_adrien_ndkopencvtest4_OpencvNativeClass.cpp 


LOCAL_LDLIBS += -llog 

LOCAL_MODULE := MyOpencvLibs 


include $(BUILD_SHARED_LIBRARY) 

,只是增加了底部,你需要额外的模块:

include $(CLEAR_VARS) 
LOCAL_MODULE := nonfree 
LOCAL_SRC_FILES := libnonfree.so 
include $(PREBUILT_SHARED_LIBRARY) 

现在文件C:\Users\Adrien\AndroidStudioProjects\NDKOpencvTest4\app\src\main\jni\libnonfree.so将被打包到您的APK中。

如果你需要这个库,如果你在com_example_adrien_ndkopencvtest4_OpencvNativeClass.cpp代码使用从出口libnonfree.so一些功能链接你的libMyOpencvLibs.so(这意味着,你也应该refeence它你的模块中:

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

#opencv 
OPENCVROOT:= C:\OpenCV-2.4.10-android-sdk 
OPENCV_CAMERA_MODULES:=on 
OPENCV_INSTALL_MODULES:=on 
OPENCV_LIB_TYPE:=SHARED 
include ${OPENCVROOT}/sdk/native/jni/OpenCV.mk 

LOCAL_SRC_FILES := com_example_adrien_ndkopencvtest4_OpencvNativeClass.cpp 
LOCAL_LDLIBS += -llog 
LOCAL_SHARED_LIBRARIES += nonfree 
LOCAL_MODULE := MyOpencvLibs 
include $(BUILD_SHARED_LIBRARY) 

include $(CLEAR_VARS) 
LOCAL_MODULE := nonfree 
LOCAL_SRC_FILES := libnonfree.so 
include $(PREBUILT_SHARED_LIBRARY) 
+0

感谢您的回答,我编辑了我的问题。 – Megatron300

0

修改您的android.mk为:

LOCAL_PATH := $(call my-dir) 
OPENCV_PATH := D:/CODE/OpenCV-2.4.10-android-sdk/sdk/native/jni 

include $(CLEAR_VARS) 
LOCAL_MODULE := nonfree 
LOCAL_SRC_FILES := libnonfree.so 
include $(PREBUILT_SHARED_LIBRARY) 

include $(CLEAR_VARS) 

#opencv 
OPENCVROOT:= C:\OpenCV-2.4.10-android-sdk 
OPENCV_CAMERA_MODULES:=on 
OPENCV_INSTALL_MODULES:=on 
OPENCV_LIB_TYPE:=SHARED 
include ${OPENCVROOT}/sdk/native/jni/OpenCV.mk 

LOCAL_SRC_FILES := com_example_adrien_ndkopencvtest4_OpencvNativeClass.cpp 

LOCAL_SHARED_LIBRARIES += nonfree 

LOCAL_LDLIBS += -llog 

LOCAL_MODULE := MyOpencvLibs 

include $(BUILD_SHARED_LIBRARY) 

这里prebui LD库即libnonfree.so在android.mk申报,并通过

LOCAL_SHARED_LIBRARIES += nonfree 

现在以后把它引用到使用它,你需要在YOUT MainActivity加载最新建库即

System.loadLibrary("MyOpencvLibs"); 

这就是它,现在你已经合并两个android.mk文件到名为一个新的模块:MyOpencvLibs

为了更好地理解,你可以看我的博客:https://androidtutsweb.wordpress.com/2017/04/04/android-mk-for-ndk-build-using-pre-build-libraries/