2015-01-30 2 views
5

Я использую android studio 1.0.2, и я пытаюсь создать андроидную библиотеку, которая использует функции ndk и туземцев. Это в основном архитектура моего проекта:Использование готовых библиотек и jni в Android Studio

MyProject 
---| MyAndroidApp 
---| MyAndroidLibrary 
    ---| jni 
    ---| jniLibs 

В моем андроиде библиотеки, у меня есть один C++ обертки, которая вызывает функцию из общей библиотеки. Я создал эту библиотеку с ndk-build (она отлично работает с eclipse). Я добавил эту библиотеку в папку/архитектуры jniLibs (arm64-v8a, armeabi, armeabi-v7a, mips, mips64, x86 и x86_64). я определил следующие Ароматизаторы в моем MyAndroidLibrary/build.gradle:

productFlavors { 
    x86 { 
     flavorDimension "abi" 
     ndk { 
      abiFilter "x86" 
     } 
    } 
    arm { 
     flavorDimension "abi" 
     ndk { 
      abiFilter "armeabi-v7a" 
     } 
    } 
    mips { 
     flavorDimension "abi" 
     ndk { 
      abiFilter "mips" 
     } 
    } 
    fat { 
     flavorDimension "abi" 
    } 
} 

Однако, когда я пытаюсь вызвать мои функции библиотеки из кода JNI, я получаю неопределенную ссылочную ошибку. Другими словами, моя общая библиотека, похоже, не загружена на стороне jni. Но, когда я удаляю вызов этой функции, и я изучаю .aar, который создается на выходе, я могу получить библиотеку .so.

Я не очень хорошо знаком с материалом градиента, поэтому я не уверен, что он действительно построил.

Что я ищу строгий эквивалент этого Android.mk, используя Gradle:

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 

LOCAL_MODULE   := mysharedlib 
LOCAL_SRC_FILES   := ../shared/mysharedlib.so 
LOCAL_EXPORT_C_INCLUDES := ../shared/includes/mysharedlib.h 

include $(PREBUILT_SHARED_LIBRARY) 

include $(CLEAR_VARS) 

LOCAL_MODULE   := jni 
LOCAL_SRC_FILES   := jni.cpp 
LOCAL_C_INCLUDES  += ../shared/includes/mysharedlib.h 
LOCAL_LDLIBS   := -llog 
LOCAL_SHARED_LIBRARIES := mysharedlib 

include $(BUILD_SHARED_LIBRARY) 

Я хотел бы вызывать функции из предварительно встроенной библиотеки на моем JNI коде, например:

#include "MyDLL.h" 

JNIEXPORT jint JNICALL Java_com_iskn_dbapi_DBAPI_getNegative(JNIEnv *env, jclass obj, jint integer) 
{ 
    return MyDLL::getNegative(integer); 
} 

Благодарим за ответы.

+0

Вы, наконец, исправились? –

ответ

1

В настоящее время плагин gradle не поддерживает такую ​​конфигурацию NDK. Он игнорирует существующий Android.mk и генерирует собственный (очень ограниченный) «на лету». Вы можете увидеть here, как он генерирует (посмотрите на метод writeMakefile) и оцените сами по себе, насколько ограничен набор опций, влияющих на его генерацию.

Практически, для достижения того, что вам нужно, лучшим способом было бы полностью отключить поддержку NDK, ограниченную градиентом, и явно вызвать ndk-build. Прочтите here.

+0

Благодарим вас за ответ. Ну, на самом деле, мне нужен град, чтобы создать .aar. Но папка jniLibs не предназначена для встроенных библиотек, в которые она входит? Согласно этой [ссылке] (http://www.hellsoft.se/android/android-ndk-and-the-gradle-build-system/), см. Раздел «Предварительно построенные librairies». – Sierra

+0

Извините, я не понял, о чем вы просили. Не могли бы вы перефразировать, что ваш вопрос? BTW, в приведенной выше ссылке вы можете увидеть строку 'sourceSets.main.jniLibs.srcDir 'src/main/libs'' - это означает, что папка будет использоваться для упаковки собственных библиотек в APK, а не в jniLibs. –

+0

Несомненно. Мне нужен файл .aar (архив андроида), который будет содержать мою общую библиотеку. И для этого я должен использовать градлу, не так ли? Другое дело, что я видел в вышеприведенной ссылке, что все библиотеки в папках jniLibs должны быть автоматически предварительно построены, верно? – Sierra