2015-03-06 3 views
2

Чтобы запустить некоторый собственный код, вы можете выполнить команду ndk-build, но я запутался, если Eclipse или Android Studio IDE выполнили эту команду автоматически в момент компиляции или как команда ndk-build связанные с указанными IDE, когда я компилирую свой код с помощью eclipse или студии droid?NDK-build vs Android Studio NDK Build

+0

http://ph0b.com/android-studio-gradle-and-ndk-integration/ для фона на AS ... ndk –

ответ

0

Если вы хотите, вы можете скомпилировать его с помощью терминалов команды, или же вы можете настроить оба Иды сделать автоматически

0

Сегодня Android-Studio (Canary) Preview 1.3 RC1 был выпущен с поддержкой JNI/НДК из коробки , Не нужно больше обращаться к инструментам командной строки.

https://sites.google.com/a/android.com/tools/download/studio/canary/latest

выпуск: https://sites.google.com/a/android.com/tools/recent/androidstudiowithandroidndkpreviewsupportavailable

+0

Я должен предупредить вас об Android Studio Preview 1.3 RC1: создание или добавление зависимости к статической библиотеке пока не поддерживается. Это означает, что если у вас есть статическая библиотека в вашем проекте, вы должны остаться со старой системой компиляции, и вы не сможете обновить град. Следствием среди других является то, что вы не можете использовать новую функцию отладки, которая требует экспериментальной градации 2.5. – syl8o

3

Для затмения, уже слишком много источников в Интернете, связанных с ним, так что я буду говорить о Android Studio здесь.

Если у вас нет собственных исходных файлов onw (C++, C) в своем проекте, просто поместите собственные .a или .so родные библиотеки в папки src/main/jniLibs, и вам не нужно ничего изменять в файле градиента. Система сделает все за вас автоматически.

Если у вас есть собственные собственные файлы и поместили их в папку src/main/jni, вам необходимо создать свои собственные make-файлы и поместить их в папку jni. Вы также должны изменить файл градиента в своем модуле приложения.

Вот что я сделал для образца обнаружения лица opencv, и я получил исходный код из этого замечательного сообщения (Here), который был фактически изменен из другого метода для более простого выполнения. Философия довольно проста: собрать коды природного источника и поместить сгенерированный .so/.a библиотеки в папку jniLibs:

Моя структура проекта: Project Structure

Мои Makefiles (убедитесь, что у вас есть оригинальный SDK библиотеки для ссылки в Makefile):

Android.mk:

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 

OPENCV_CAMERA_MODULES:=on 
OPENCV_INSTALL_MODULES:=on 
OPENCV_LIB_TYPE:=SHARED 
include /home/ng/Desktop/OpenCV-android-sdk/sdk/native/jni/OpenCV.mk 

LOCAL_SRC_FILES := DetectionBasedTracker_jni.cpp 
LOCAL_C_INCLUDES += $(LOCAL_PATH) 
LOCAL_LDLIBS  += -llog -ldl 

LOCAL_MODULE  := detection_based_tracker 

include $(BUILD_SHARED_LIBRARY) 

Application.mk:

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

Мой файл gradle.build в модуле приложения:

apply plugin: 'com.android.application' 
android { 
    compileSdkVersion 23 
    buildToolsVersion "23.0.1" 

    defaultConfig { 
     applicationId "org.opencv.samples.facedetect" 
     minSdkVersion 14 
     targetSdkVersion 19 
     versionCode 1 
     versionName "1.0" 
    } 
    sourceSets.main.jni.srcDirs = [] 

    task ndkBuild(type: Exec, description: 'Compile JNI source via NDK') { 
     // ndkDir = project.plugins.findPlugin('com.android.application').getNdkFolder() 
     commandLine "$ndkDir/ndk-build", 
       '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(dir: 'libs', include: ['*.jar']) 
    testCompile 'junit:junit:4.12' 
    compile 'com.android.support:appcompat-v7:23.1.0' 
    compile project(':openCVLibrary300') 
} 

Вы на самом деле не изменить другие Gradle файлы для компиляции родной части проекта. Вы также можете скомпилировать исходные коды источников по командной строке и поместить файлы .so обратно в папку jniLibs. Это также работает. Надеюсь, это поможет в вашей проблеме.