这个问题已经在这里有一个答案:
- NDK的Android和谷歌Play筛选的 2个答案
我想将Vuforia增强现实库(JNI)在Android项目整合。 该AR是不是应用程序的核心,它更像是一个边的小工具。 但Vuforia库不提供x86架构,这意味着86 Android手机将无法下载该应用。
有没有办法授权的x86手机下载应用程序,只是不要让他们发挥应用的AR一部分? 这意味着一种方式与缺少库编译为x86架构,并检测其拱起应用程序正在运行吗?
我知道有没有很多的x86 Android手机,并在年底,我可能会被迫等待Vuforia释放他们的.so的x86版,但我想知道是否有一种方法做什么我这里描述。
你可以嘲笑vuforia
通过使用工具(如cmock ?)来创建头文件存根然后用它建立NDK
为x86
和使用产生so
在你的应用程序(共享对象)。
在这种情况下,你也应该在处理你的代码不同的架构很好这可能意味着读了值一样Build.CPU_ABI
我建议你把这样的项目在github
,以便其他人也可以从中利用。 我不是牌,但使用头文件应该是相当的法律专家。
这里是我解决了这个问题很容易实际。 THX @auselen帮助。
你有定期Android.mk是x86架构的失败,因为你使用的库(libExternalLibrary.so)仅供手臂阿尔基。 你想建立一个基于这个库一个.so(libMyLibraryBasedOnExternalLibrary.so)。
1)创建2个虚拟.cpp文件Dummy0.cpp和Dummy1.cpp为例Dummy0.cpp看起来是这样的:
#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
然后,编辑构建库,并修改它这样的Android.mk:
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
当然,要确保在你的代码时,您的应用程序上仅适用于x86设备上运行,你从来没有调用库:
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)
// ...
}