C'è una risposta molto completa a questa stessa domanda qui: http://grokbase.com/t/gg/android-ndk/125v31e6wy/play-store-market-filtering-of-ndk-libs
Permettetemi di postare la mia soluzione, è quasi la stessa che ho postato qui : Android library .so with x86 architecture missing? (Vuforia)
Quindi si dispone di un normale Android.mk che non può essere compilato su architettura x86 in quanto la libreria (libExternalLibrary.so) che si sta utilizzando viene fornita solo per archi arm. Si desidera creare un .so (libMyLibraryBasedOnExternalLibrary.so) basato su questa libreria e, naturalmente, non verrà mai compilato su x86 senza la libreria.
L'idea è di generare librerie Dummy per x86 direttamente direttamente in Android.mk, utilizzando le istruzioni di compilazione condizionale.
1) Creare 2 file cpp fittizi Dummy0.cpp e Dummy1.cpp exemple Dummy0.cpp assomiglia a questo:
#include <jni.h>
#include <android/log.h>
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include <math.h>
#include <string>
#ifdef __cplusplus
extern "C"
{
#endif
int dummy0 = 0;
#ifdef __cplusplus
}
#endif
Quindi, modificare l'Android.mk che costruisce la libreria e modificarlo in questo modo:
LOCAL_PATH := $(call my-dir)
ifeq ($(TARGET_ARCH_ABI), armeabi)
# In this condtion block, we're compiling for arm architecture, and the libExternalLibrary.so is avaialble
# Put every thing the original Android.mk was doing here, importing the prebuilt library, compiling the shared library, etc...
# ...
# ...
else
# In this condtion block, we're not compiling for arm architecture, and the libExternalLibrary.so is not availalble.
# So we create a dummy library instead.
include $(CLEAR_VARS)
# when LOCAL_MODULE equals to ExternalLibrary, this will create a libExternalLibrary.so, which is exactly what we want to do.
LOCAL_MODULE := ExternalLibrary
LOCAL_SRC_FILES := Dummy0.cpp
include $(BUILD_SHARED_LIBRARY)
include $(CLEAR_VARS)
# This will create a libMyLibraryBasedOnExternalLibrary.so
LOCAL_MODULE := MyLibraryBasedOnExternalLibrary
# Don't forget to tell this library is based on ExternalLibrary, otherwise libExternalLibrary.so will not be copied in the libs/x86 directory
LOCAL_SHARED_LIBRARIES := ExternalLibrary
LOCAL_SRC_FILES := Dummy1.cpp
include $(BUILD_SHARED_LIBRARY)
endif
Naturalmente, assicurarsi che nel codice che non hai mai chiamare la libreria quando la vostra applicazione è in esecuzione su un solo x86 dispositivo:
if ((android.os.Build.CPU_ABI.equalsIgnoreCase("armeabi")) || (android.os.Build.CPU_ABI2.equalsIgnoreCase("armeabi"))) {
// Good I can launch
// Note that CPU_ABI2 is api level 8 (v2.2)
// ...
}
possibile work around/mocking idea: http://stackoverflow.com/questions/15146174/android-library-so-with-x86-architecture-missing-vuforia – auselen