2017-05-29 66 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/