我想在一个Android项目中集成Vuforia增强现实库(jni)。 AR不是应用程序的核心,它更像是一个小工具。但是没有为x86架构提供Vuforia库,这意味着x86 Android手机将无法下载该应用程序。
有没有办法授权x86手机下载应用程序,只是不让他们玩应用程序的AR部分?这意味着一种使用缺少的库来编译x86 arch的方法,还可以检测应用程序正在运行哪个arch?
我知道没有很多x86安卓手机,最后,我可能会被迫等待Vuforia发布他们的.so的x86版本,但我想知道是否有办法做什么我在这里描述。
答案 0 :(得分:1)
您可以使用工具(例如cmock?)来模拟vuforia
,以便从头文件创建存根,然后使用NDK
为x86
构建存根,并使用生成的{{} 1}}(共享对象)在您的应用程序中。
在这种情况下,您还应该很好地处理代码中的不同体系结构,这可能意味着要读取Build.CPU_ABI
之类的值我建议你把这个项目放在so
下,以便其他人也可以利用它。我不是授权专家,但使用头文件应该是合法的。
答案 1 :(得分:1)
以下是我实际上很容易解决问题的方法。感谢@auselen的帮助。
您有一个常规的Android.mk在x86架构上失败,因为您正在使用的库(libExternalLibrary.so)仅用于arm archi。 您想基于此库构建.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)
// ...
}