2

Я пытаюсь создать общую библиотеку с помощью NDK. Моя структура папок имеет две папки: одну написанную на C++ (core) и одну написанную на Java, называемую project, которая является проектом Android Studio. Библиотека C++ скомпилирована и создается файл .a, но затем он не связывается с общей библиотекой. Вот мой build.gradle:Построение общих с зависимостью статической библиотеки

buildscript { 

    repositories { 
     mavenCentral() 
    } 
    dependencies { 
     classpath 'com.android.tools.build:gradle:1.3.0' 
     classpath 'net.sf.proguard:proguard-gradle:5.2.1' 
    } 
} 

apply plugin: 'android-library' 

android { 

    compileSdkVersion 16 
    buildToolsVersion "23.0.1" 

    defaultConfig { 
     minSdkVersion 16 
     targetSdkVersion 23 
     versionCode 1 
     versionName "1.0" 

     ndk { 
      moduleName "core" 
      cFlags "-std=c++11 -fexceptions -I../core/includes" 
      stl "stlport_shared" 
     } 
    } 

    sourceSets { 
     main { 
      manifest.srcFile 'AndroidManifest.xml' 
      jniLibs.srcDir 'libs' 
      jni.srcDirs = ['src/main/jni', 'src/main/jni/', 'jni/'] 
     } 
    } 

    task buildNative(type: Exec, description: 'Compile JNI source via NDK') { 
     def ndkDir = plugins.getPlugin('com.android.library').sdkHandler.getNdkFolder() 
     commandLine "$ndkDir/ndk-build", 
       '-C', file('jni').absolutePath, 
       '-j', Runtime.runtime.availableProcessors(), 
       'all', 
       'NDK_DEBUG=1' 
    } 

    task cleanNative(type: Exec, description: 'Clean JNI object files') { 
     def ndkDir = plugins.getPlugin('com.android.library').sdkHandler.getNdkFolder() 
     commandLine "$ndkDir/ndk-build", 
       '-C', file('jni').absolutePath, 
       'clean' 
    } 

    task cleanBinaryFolders(type: Delete, description: 'Clean binary folders') { 
     delete 'libs', 'obj' 
    } 

    clean.dependsOn 'cleanNative' 
    clean.dependsOn 'cleanBinaryFolders' 

    tasks.withType(JavaCompile) { 
     compileTask -> compileTask.dependsOn buildNative 
    } 
} 

dependencies { 
    compile 'com.android.support:support-v4:20.0.0' 
} 

Вот мой Android.mk:

SHELL = /bin/bash 

MY_HOMEDIR = $(realpath $(shell pwd)/../..) 
MY_COREDIR = $(MY_HOMEDIR)/core 
MY_ANDROIDDIR = $(MY_HOMEDIR)/project 

MY_CORESOURCES = $(shell find $(MY_COREDIR)/src -type f -name "*.cpp") 
MY_BRIDGESOURCES = $(shell find $(MY_ANDROIDDIR)/jni -type f -name "*.cpp") 

LOCAL_PATH = $(MY_HOMEDIR) 

# Generate a static library from the core implementation 
include $(CLEAR_VARS) 
LOCAL_MODULE = core 
LOCAL_SRC_FILES = $(MY_CORESOURCES) 
TARGET_PLATFORM = android-16 
TARGET_ARCH_ABI = all 
LOCAL_C_INCLUDES = $(MY_COREDIR)/includes 
#LOCAL_LDLIBS = -llog 
LOCAL_CFLAGS = -llog -I$(MY_COREDIR)/includes 
include $(BUILD_STATIC_LIBRARY) 

include $(CLEAR_VARS) 
LOCAL_MODULE = project 
LOCAL_SRC_FILES = $(MY_BRIDGESOURCES) 
TARGET_PLATFORM = android-16 
TARGET_ARCH_ABI = all 
LOCAL_STATIC_LIBRARIES = core 
LOCAL_C_INCLUDES = $(MY_COREDIR)/includes 
LOCAL_LDLIBS = -lcore # I’m not sure about this 
LOCAL_CFLAGS = -llog -I$(MY_COREDIR)/includes 
include $(BUILD_SHARED_LIBRARY) 

При компиляции, как это я получаю кучу undefined reference ошибок, даже если методы реализуются с помощью основного модуля. Что мне не хватает?

+0

Попробуйте заменить строку, определяющую jni.srcDirs на 'jni.srcDirs = []' –

ответ

0

https://stackoverflow.com/a/22401410/755804 гласит:

использовать только LOCAL_LDLIBS зависимостей библиотеки системы. Если вы хотите указать на другую библиотеку, гораздо лучше перечислить их в LOCAL_STATIC_LIBRARIES и LOCAL_SHARED_LIBRARIES (даже если это означает, что для них задан модуль PREBUILT_XXX), поскольку это позволяет системе сборки автоматически определять зависимости и упорядочивать вас.

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