3

Vuforia Augmented Realityライブラリ(jni)をAndroidプロジェクトに統合したいと思います。ARはアプリケーションの中核ではなく、サイドガジェットのようなものです。ただし、Vuforiaライブラリはx86アーキテクチャには提供されていません。つまり、x86Androidフォンはアプリをダウンロードできません。

x86電話にアプリのダウンロードを許可し、アプリのAR部分を再生させないようにする方法はありますか?つまり、ライブラリが欠落しているx86アーチ用にコンパイルし、アプリが実行されているアーチを検出する方法を意味しますか?

私はx86android電話があまりないことを知っています、そして結局、私はVuforiaが彼らの.soのx86バージョンをリリースするのを待たなければならないかもしれません、しかし私は私がしていることをする方法があるかどうか知りたいですここで説明します。

4

2 に答える 2

1

vuforiaツール(cmock ?など)を使用してモックを作成し、ヘッダーファイルからスタブを作成してから、アプリケーションで生成された(共有オブジェクト) NDKforを使用してスタブを構築します。x86so

その場合は、コード内のさまざまなアーキテクチャも適切に処理する必要があります。これは、Build.CPU_ABIなどの値を読み取ることを意味します。

github他の人も利用できるように、そのようなプロジェクトを下に置くことをお勧めします。私はライセンスの専門家ではありませんが、ヘッダーファイルの使用はかなり合法です。

于 2013-03-01T07:25:26.177 に答える
1

これが私が実際に問題を非常に簡単に解決した方法です。助けてくれたThx@auselen。

使用しているライブラリ(libExternalLibrary.so)はarm archiにのみ提供されているため、x86アーキテクチャで失敗する通常のAndroid.mkがあります。このライブラリに基づいて.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 に答える