2015-01-30 11 views
5

Android studio 1.0.2 kullanıyorum ve ndk ve yer işlevleri kullanan bir android kitaplık oluşturmaya çalışıyorum. Bu temelde projemin mimarisidir: my android kütüphanesindeÖnceden oluşturulmuş kütüphaneleri ve jni'yi Android Studio'da kullanma

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

, ben paylaşılan kitaplıktan işlevlerini çağıran bir tek C++ sarmalayıcı var. Bu kütüphaneyi ndk-build ile oluşturdum (tutulma ile mükemmel çalışır). Bu kütüphaneyi jniLibs klasörüne/mimarilerine ekledim (arm64-v8a, armeabi, armeabi-v7a, mips, mips64, x86 ve x86_64). benim MyAndroidLibrary/build.gradle aşağıdaki Flavors tanımlamıştır: Ben jni kodundan Kütüphanemin işlevleri çağırmak çalıştığınızda

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

Ancak, ben tanımlanmamış bir referans hatası alıyorum. Başka bir deyişle, paylaşılan kütüphanem jni tarafında yüklenmemiş gibi görünüyor. Ancak, bu işlevin çağrısını kaldırdığımda ve çıktıda oluşturulan aa'yı keşfettiğimde, kütüphaneyi geri alabilirim .so.

Notlara pek aşina değilim, bu yüzden gerçekten neyi geliştirdiğinden emin değilim.

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) 
benim jni kodu önceden oluşturulmuş bir kütüphaneden işlevleri çağırmak istiyorum

, örneğin:



Ne aradığım o Android.mk sıkı bir eşdeğer kullanılarak gradle olduğu
#include "MyDLL.h" 

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

Yanıtlarınız için teşekkür ederiz.

+0

Sonunda bunu düzelttiniz mi? –

cevap

1

Şu anda dikey eklenti, bu tür NDK yapılandırmasını desteklemiyor. Mevcut Android.mk'yi yok sayar ve anında (çok sınırlı) bir tane yaratır. here'u nasıl ürettiğini (writeMakefile yöntemine bakın) görebilir ve kendi kısıtlamasının seçenekler kümesini nasıl etkilediğini kendi neslini etkileyebilir.

Pratik olarak, ihtiyacınız olanı elde etmek için en iyi yol, sınırlı sınırlı NDK desteğini tamamen devre dışı bırakmak ve ndk-build'i açıkça çağırmak olacaktır. Ayrıntılar için here'u okuyun.

+0

Cevabınız için teşekkür ederiz. Şey, aslında, bir .aar yaratmaya ihtiyacım var. Fakat jniLibs klasörünün içerdiği kütüphaneler önceden oluşturulmamış mı? Buna göre [link] (http://www.hellsoft.se/android/android-ndk-and-the-gradle-build-system/), Önceden Oluşturulmuş kütüphaneler bölümüne bakın. – Sierra

+0

Üzgünüm, ne istediğini anlamadım. Sorunun ne olduğunu tekrar söyleyebilir misiniz? BTW, yukarıdaki bağlantıda 'sourceSets.main.jniLibs.srcDir 'src/main/libs'' satırını görebilirsiniz - bu, klasörün' jniLibs 'değil, yerel kitaplıkları APK'ya paketlemek için kullanılacağı anlamına gelir. –

+0

Elbette. İhtiyacım olan şey, paylaşılan kütüphanemi içerecek bir .aar (android arşivi). Ve bunun için, kürek kullanmalıyım, değil mi? Başka bir şey, yukarıda yazılan bağlantıda, jniLibs klasörlerindeki tüm kitaplıkların otomatik olarak önceden oluşturulmuş olması gerektiğini gördüm, doğru mu? – Sierra

İlgili konular