3

我想将 Vuforia 增强现实库 (jni) 集成到 Android 项目中。AR 不是应用程序的核心,它更像是一个小工具。但是 X86 架构没有提供 Vuforia 库,这意味着 x86 Android 手机将无法下载该应用程序。

有没有办法授权x86手机下载app,只是不让他们玩app的AR部分?这意味着一种为缺少库的 x86 架构编译的方法,还可以检测应用程序运行在哪个架构上?

我知道没有很多 x86 android 手机,最后,我可能会被迫等待 Vuforia 发布他们的 .so 的 x86 版本,但我想知道是否有办法做我正在做的事情在这里描述。

4

2 回答 2

1

这是我实际上很容易解决问题的方法。感谢@auselen 的帮助。

您有一个在 x86 架构上失败的常规 Android.mk,因为您使用的库 (libExternalLibrary.so) 仅提供给 arm 架构。您想基于此库构建一个 .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)
    // ...
}
于 2013-03-04T07:32:49.467 回答
1

您可以vuforia使用工具(如cmock?)进行模拟,从头文件创建存根,然后使用NDKfor构建它并在应用程序中x86使用生成的(共享对象)。so

在这种情况下,您还应该很好地处理代码中的不同架构,这可能意味着读取诸如Build.CPU_ABI 之类的值

我建议你把这样的项目放在下面,github这样其他人也可以利用它。我不是许可方面的专家,但使用头文件应该是相当合法的。

于 2013-03-01T07:25:26.177 回答