2016-09-15 4 views
4

Я пытаюсь, чтобы студия Android была моей основной средой разработки для Java и кода c/C++. Я хочу иметь возможность отлаживать собственный код.Android gradle ndk jni build с внешней библиотекой и собственной отладкой (ARToolkit)

В этом случае я пытаюсь использовать ARToolkit5 в качестве библиотеки.

Из-за некоторых примеров в ARToolkit5 у меня есть этот файл сборки.

я имею этот Android.mk файл

MY_LOCAL_PATH := $(call my-dir) 
LOCAL_PATH := $(MY_LOCAL_PATH) 

# Pull ARToolKit into the build 
include $(CLEAR_VARS) 
ARTOOLKIT_DIR := $(MY_LOCAL_PATH)/../../../../../artoolkit5/android 
ARTOOLKIT_LIBDIR := $(call host-path, $(ARTOOLKIT_DIR)/obj/local/$(TARGET_ARCH_ABI)) 
define add_artoolkit_module 
    include $(CLEAR_VARS) 
    LOCAL_MODULE:=$1 
    LOCAL_SRC_FILES:=lib$1.a 
    include $(PREBUILT_STATIC_LIBRARY) 
endef 
ARTOOLKIT_LIBS := ar2 kpm util eden argsub_es armulti ar aricp jpeg arvideo 
LOCAL_PATH := $(ARTOOLKIT_LIBDIR) 
$(foreach module,$(ARTOOLKIT_LIBS),$(eval $(call add_artoolkit_module,$(module)))) 

LOCAL_PATH := $(MY_LOCAL_PATH) 

# Android arvideo depends on CURL. 
CURL_DIR := $(ARTOOLKIT_DIR)/jni/curl 
CURL_LIBDIR := $(call host-path, $(CURL_DIR)/libs/$(TARGET_ARCH_ABI)) 
define add_curl_module 
    include $(CLEAR_VARS) 
    LOCAL_MODULE:=$1 
    #LOCAL_SRC_FILES:=lib$1.so 
    #include $(PREBUILT_SHARED_LIBRARY) 
    LOCAL_SRC_FILES:=lib$1.a 
    include $(PREBUILT_STATIC_LIBRARY) 
endef 
#CURL_LIBS := curl ssl crypto 
CURL_LIBS := curl 
LOCAL_PATH := $(CURL_LIBDIR) 
$(foreach module,$(CURL_LIBS),$(eval $(call add_curl_module,$(module)))) 

LOCAL_PATH := $(MY_LOCAL_PATH) 
include $(CLEAR_VARS) 

# ARToolKit libs use lots of floating point, so don't compile in thumb mode. 
LOCAL_ARM_MODE := arm 

LOCAL_PATH := $(MY_LOCAL_PATH) 
LOCAL_MODULE := ndkDebugModule 
LOCAL_SRC_FILES := nftSimple.cpp ARMarkerNFT.c trackingSub.c 

# Make sure DEBUG is defined for debug builds. (NDK already defines NDEBUG for release builds.) 
ifeq ($(APP_OPTIM),debug) 
    LOCAL_CPPFLAGS += -DDEBUG 
endif 

LOCAL_C_INCLUDES += $(ARTOOLKIT_DIR)/../include/android $(ARTOOLKIT_DIR)/../include 
LOCAL_LDLIBS += -llog -lGLESv1_CM -lz 
LOCAL_WHOLE_STATIC_LIBRARIES += ar 
LOCAL_STATIC_LIBRARIES += ar2 kpm util eden argsub_es armulti aricp jpeg arvideo cpufeatures 
#LOCAL_SHARED_LIBRARIES += $(CURL_LIBS) 
LOCAL_STATIC_LIBRARIES += $(CURL_LIBS) 

include $(BUILD_SHARED_LIBRARY) 

$(call import-module,android/cpufeatures) 

Эта сборка работает должным образом. Теперь я пытаюсь преобразовать это в файл экспериментального градиента Android, чтобы иметь возможность его отлаживать. Ну теперь я имею это состояние:

apply plugin: 'com.android.model.application' 

model { 
    android { 
     compileSdkVersion = 23 
     buildToolsVersion = "23.0.3" 

     defaultConfig.with { 
      applicationId = "com.nomad5.ndkdebug" 
      minSdkVersion.apiLevel = 16 
      targetSdkVersion.apiLevel = 23 
      versionCode = 1 
      versionName = "0.1" 
     } 
    } 
    /* 
    * native build settings 
    */ 
    android.ndk { 
     moduleName = "ndkDebugModule" 
     cppFlags.add("-I./../../../../../artoolkit5/include/ ") 
    } 

    android.buildTypes { 
     release { 
      minifyEnabled = false 
      proguardFiles.add(file('proguard-rules.txt')) 
     } 
     debug { 
      debuggable = true 
      ndk.with { 
       debuggable = true 
      } 
     } 
    } 
} 

/** 
* The android native sources 
*/ 
android.sources.main { 
    jni { 
     exportedHeaders { 
      srcDirs = [arRoot.absolutePath + "/include", 
         arRoot.absolutePath + "/android/jni/curl/include"] 
     } 
     source { 
      /* we set this to NOT automatically compile everything */ 
      srcDirs = ["src/main"] 
      include "jni/nativeCodeA.cpp" 
      include "jni/nativeCodeB.cpp" 

     } 
     dependencies { 
      library "lib_ar2" linkage "static" 
      library "lib_kpm" linkage "static" 
      library "lib_util" linkage "static" 
      library "lib_eden" linkage "static" 
      library "lib_argsub_es" linkage "static" 
      library "lib_armulti" linkage "static" 
      library "lib_ar" linkage "static" 
      library "lib_aricp" linkage "static" 
      library "lib_jpeg" linkage "static" 
      library "lib_arvideo" linkage "static" 
      library "lib_cpufeatures" linkage "static" 
      library "lib_curl" linkage "static" 
     } 
    } 
    jniLibs { 
     source { 
      srcDirs = [arRoot.absolutePath + "/include", 
         arRoot.absolutePath + "/android/jni/curl/include"] 
     } 
    } 
} 

dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    testCompile 'junit:junit:4.12' 
    compile project(':aRBaseLib') 
    compile 'com.android.support:appcompat-v7:23.4.0' 
}   

Проблема с Gradle НКА билда, что в моих файлах (nativeCodeA.cpp, например) все включает, которые в ../../../../../artoolkit5/android не найден. Поэтому все

#include <AR/ar.h> 
#include <AR/arMulti.h> 
#include <AR/video.h> 
... 

не найдены.

Как добавить папку в конструкцию ndk, известную как gradle, как LOCAL_C_INCLUDES в make-файле. И как я могу указать конкретные файлы для компиляции, как LOCAL_SRC_FILES в make-файле. (Как Gradle знает файлы, даже если не указать те явно?)

Кстати я использую

distributionUrl=https\://services.gradle.org/distributions/gradle-2.8-all.zip 

с

'com.android.tools.build:gradle-experimental:0.4.0' 
+0

только предположение, но проект рабочего каталога вероятно, отличается от разных систем сборки. Чтобы проверить это, измените относительный путь include (ов) на абсолютный путь (пути). Если это работает, попробуйте изменить количество '../' в относительных путях. –

+0

ну, как вы видите в комментариях, я тоже пробовал это с абсолютными путями –

+0

Как вы закончили настройку ** NDEBUG ** в gradle-experimental? –

ответ

1

Хорошо, я исследовал много и нашли несколько примеров, которые работают. Прежде всего, вы должны использовать последнюю Gradle плагин как Экспериментальные это в корне build.gradle

'com.android.tools.build:gradle-experimental:0.4.0' 

Тогда ваш Gradle файл будет выглядеть следующим образом

apply plugin: 'com.android.model.application' 

/** 
* The ar.dir in relative format 
*/ 
def arRoot = new File("../artoolkit5") 
def arPath = arRoot.absolutePath + '/android/obj/local/' 
def curlPath = arRoot.absolutePath + '/android/jni/curl/libs/' 

/** 
* The main experimental model 
*/ 
model { 

    /** 
    * Android APK values 
    */ 
    android { 
     compileSdkVersion = 23 
     buildToolsVersion = "23.0.3" 

     defaultConfig.with { 
      applicationId = "com.nomad5.ndkdebug" 
      minSdkVersion.apiLevel = 16 
      targetSdkVersion.apiLevel = 23 
      versionCode = 1 
      versionName = "0.1" 
     } 
    } 

    /** 
    * The build types 
    */ 
    android.buildTypes { 
     release { 
      minifyEnabled = false 
      proguardFiles.add(file('proguard-rules.txt')) 
     } 
     debug { 
      debuggable = true 
      ndk.with { 
       debuggable = true 
      } 
     } 
    } 

    /** 
    * All statically linked libs 
    */ 
    repositories { 
     libs(PrebuiltLibraries) { 
      lib_ar2 { 
       binaries.withType(StaticLibraryBinary) { 
        staticLibraryFile = file("${arPath}${targetPlatform.getName()}/libar2.a") 
       } 
      } 
      lib_kpm { 
       binaries.withType(StaticLibraryBinary) { 
        staticLibraryFile = file("${arPath}${targetPlatform.getName()}/libkpm.a") 
       } 
      } 
      lib_util { 
       binaries.withType(StaticLibraryBinary) { 
        staticLibraryFile = file("${arPath}${targetPlatform.getName()}/libutil.a") 
       } 
      } 
      lib_eden { 
       binaries.withType(StaticLibraryBinary) { 
        staticLibraryFile = file("${arPath}${targetPlatform.getName()}/libeden.a") 
       } 
      } 
      lib_argsub_es { 
       binaries.withType(StaticLibraryBinary) { 
        staticLibraryFile = file("${arPath}${targetPlatform.getName()}/libargsub_es.a") 
       } 
      } 
      lib_armulti { 
       binaries.withType(StaticLibraryBinary) { 
        staticLibraryFile = file("${arPath}${targetPlatform.getName()}/libarmulti.a") 
       } 
      } 
      lib_ar { 
       binaries.withType(StaticLibraryBinary) { 
        staticLibraryFile = file("${arPath}${targetPlatform.getName()}/libar.a") 
       } 
      } 
      lib_aricp { 
       binaries.withType(StaticLibraryBinary) { 
        staticLibraryFile = file("${arPath}${targetPlatform.getName()}/libaricp.a") 
       } 
      } 
      lib_jpeg { 
       binaries.withType(StaticLibraryBinary) { 
        staticLibraryFile = file("${arPath}${targetPlatform.getName()}/libjpeg.a") 
       } 
      } 
      lib_arvideo { 
       binaries.withType(StaticLibraryBinary) { 
        staticLibraryFile = file("${arPath}${targetPlatform.getName()}/libarvideo.a") 
       } 
      } 
      lib_cpufeatures { 
       binaries.withType(StaticLibraryBinary) { 
        staticLibraryFile = file("${arPath}${targetPlatform.getName()}/libcpufeatures.a") 
       } 
      } 
      lib_curl { 
       binaries.withType(StaticLibraryBinary) { 
        staticLibraryFile = file("${curlPath}${targetPlatform.getName()}/libcurl.a") 
       } 
      } 
     } 
    } 

    /* 
    * native build settings 
    */ 
    android.ndk { 
     moduleName = "ndkDebugModule" 
     toolchain = "clang" 
     stl = "c++_static" 
     platformVersion = 15 
     cppFlags.addAll(["-frtti", 
         "-fexceptions", 
         "-I${file(arRoot.absolutePath + "/include")}".toString(), 
         "-I${file(arRoot.absolutePath + "/android/jni/curl/include")}".toString() 
     ]) 
     ldLibs.addAll(['android', 
         'log', 
         'z', 
         'GLESv1_CM']) 
     abiFilters.addAll(["armeabi-v7a", 
          /*"arm64-v8a",*/ 
          "x86", 
          /*"x86_64"*/]) 
    } 

    /** 
    * The android native sources 
    */ 
    android.sources.main { 
     jni { 
      exportedHeaders { 
       srcDirs = [arRoot.absolutePath + "/include", 
          arRoot.absolutePath + "/android/jni/curl/include"] 
      } 
      source { 
       /* we set this to NOT automatically compile everything */ 
       srcDirs = ["src/main"] 
       include "jni/nativeCodeA.cpp" 
       include "jni/nativeCodeB.cpp" 

      } 
      dependencies { 
       library "lib_ar2" linkage "static" 
       library "lib_kpm" linkage "static" 
       library "lib_util" linkage "static" 
       library "lib_eden" linkage "static" 
       library "lib_argsub_es" linkage "static" 
       library "lib_armulti" linkage "static" 
       library "lib_ar" linkage "static" 
       library "lib_aricp" linkage "static" 
       library "lib_jpeg" linkage "static" 
       library "lib_arvideo" linkage "static" 
       library "lib_cpufeatures" linkage "static" 
       library "lib_curl" linkage "static" 
      } 
     } 
     jniLibs { 
      source { 
       srcDirs = [arRoot.absolutePath + "/include", 
          arRoot.absolutePath + "/android/jni/curl/include"] 
      } 
     } 
    } 
} 

/** 
* The Java dependencies 
*/ 
dependencies { 
    compile fileTree(dir: 'libs', include: ['*.jar']) 
    testCompile 'junit:junit:4.12' 
    compile project(':aRBaseLib') 
    compile 'com.android.support:appcompat-v7:23.4.0' 
    compile 'com.android.support:design:23.4.0' 
} 

/** 
* Dynamically add libs to the linker 
*/ 
class SampleMigrationRuleSource extends RuleSource { 

    @Mutate 
    void injectArmeabiV7aDebugLinkerFlags(
      @Path('tasks.linkNdkDebugModuleArmeabi-v7aDebugSharedLibrary') 
        Task linkTask) { 
     injectLinkerFlags(linkTask, 'armeabi-v7a', 'debug') 
    } 

    @Mutate 
    void injectArmeabiV7aReleaseLinkerFlags(
      @Path('tasks.linkNdkDebugModuleArmeabi-v7aReleaseSharedLibrary') 
        Task linkTask) { 
     injectLinkerFlags(linkTask, 'armeabi-v7a', 'release') 
    } 

    @Mutate 
    void injectX86DebugLinkerFlags(
      @Path('tasks.linkNdkDebugModuleX86DebugSharedLibrary') 
        Task linkTask) { 
     injectLinkerFlags(linkTask, 'x86', 'debug') 
    } 

    @Mutate 
    void injectX86ReleaseLinkerFlags(
      @Path('tasks.linkNdkDebugModuleX86ReleaseSharedLibrary') 
        Task linkTask) { 
     injectLinkerFlags(linkTask, 'x86', 'release') 
    } 

    private void injectLinkerFlags(linkTask, arch, buildType) { 

     def arRoot = new File("../artoolkit5") 
     def arPath = arRoot.absolutePath + '/android/obj/local/' 
     def curlPath = arRoot.absolutePath + '/android/jni/curl/libs/' 

     linkTask.doFirst { 
      // We are pretty clueless on this one but it is needed 
      if (arch.equals('arm64-v8a')) { 
       properties["linkerArgs"].add("-fuse-ld=gold") 
      } 

      properties["linkerArgs"].addAll([ 
        "-l${arPath}/${arch}/libar.a".toString(), 
        "-l${arPath}/${arch}/libar2.a".toString(), 
        "-l${arPath}/${arch}/libutil.a".toString(), 
        "-l${arPath}/${arch}/libkpm.a".toString(), 
        "-l${arPath}/${arch}/libeden.a".toString(), 
        "-l${arPath}/${arch}/libargsub_es.a".toString(), 
        "-l${arPath}/${arch}/libarmulti.a".toString(), 
        "-l${arPath}/${arch}/libaricp.a".toString(), 
        "-l${arPath}/${arch}/libjpeg.a".toString(), 
        "-l${arPath}/${arch}/libarvideo.a".toString(), 
        "-l${arPath}/${arch}/libcpufeatures.a".toString(), 
        "-l${curlPath}/${arch}/libcurl.a".toString(), 
      ]) 
     } 
    } 
} 

apply plugin: SampleMigrationRuleSource 

 Смежные вопросы

  • Нет связанных вопросов^_^