1

デスクトップと Android のネイティブ (C++) クロスプラットフォーム ロギングを作成しようとしています。そのために、抽象ネイティブ Logger クラスと、実装されたログ メソッドを使用して適切に継承されたクラス (StdoutLogger、AndroidLogger など) を作成しました。したがって、Android がネイティブ ロギングをサポートしているのは __android_log_print(int prio, const char *tag, const char *fmt, ...) メソッドであり、無数の引数を持つ printf のような構文で動作するため、抽象ログ メソッドを作成しました。同様の構文で作業するには:

virtual void log(int aLogLevel, const char *tag, const char *format, ...)=0;

これらの不定数の引数を Android ロギング メソッドに渡すには、同じことを行いますが、不定数のパラメーターの代わりに va_list を取る別のメソッドを使用する必要があることがわかりました。これは log.h にも存在し、__android_log_vprint(int prio, const char *tag, const char *fmt, va_​​list ap) と呼ばれるため、代わりにそのメソッドの引数を渡すだけです。

問題は、これがすべて機能するためには、これに必要なすべてのもの (va_list の宣言など) を含む stdarg.h が必要ですが、デフォルトでは Eclipse がそれを見つけることができないということです: 未解決の包含:

Eclipse プロジェクト設定では、私のインクルード ディレクトリには以下が含まれます。

${NDKROOT}/platforms/android-9/arch-arm/usr/include
${NDKROOT}/sources/cxx-stl/gnu-libstdc++/4.6/include
${NDKROOT}/sources/cxx-stl/gnu-libstdc++/4.6/libs/armeabi-v7a/include

stdarg.h は C 標準ライブラリの一部であるため、欠落しているのはかなり奇妙です。

ここで検索して見つけたので、インクルードディレクトリに追加しました:

${NDKROOT}/toolchains/arm-linux-androideabi-4.6/prebuilt/windows-x86_64/lib/gcc/arm-linux-androideabi/4.6/include

この後、うまく機能しましたが、これが正しい方法であるかどうかはわかりません。

とにかく、後で(別の継承されたクラスで log メソッドを実装するときに)vfprintf メソッドに関する別の問題に遭遇しました。

virtual void Log(int aLogLevel, const char *tag, const char *format, ...)
{
    if (aLogLevel >= loglevel)
    {
        va_list args;
        va_start (args, format);
        vfprintf (stdout, format, args);
        va_end (args);
    }
}

Eclipse はエラーを示しました:

Invalid arguments ' Candidates are: int vfprintf(__sFILE *, const char *, char *) '

私がチェックしたところ、va_listではなく__va_list(最初に__が付いている)が必要だったようで、明らかに互換性がないように見えました(Eclipseによると)。この vfprintf は stdio.h にあったので、検索を開始し、stdarg.h を見つけた同様のフォルダーで別の stdio.h を見つけたので、ディレクトリも含めるように追加しました (そしてそれを一番上に移動しました)。

${NDKROOT}/toolchains/arm-linux-androideabi-4.6/prebuilt/windows-x86_64/lib/gcc/arm-linux-androideabi/4.6/include-fixed

現在、すべてのエラーがなくなり、すべてが機能しているように見えますが、これが本当に正しい方法であったかどうかは本当にわかりません. 私は最新の Eclipse/CDT/NDK/etc を持っています。どんな助けでも大歓迎です。

編集: fadden:答えてくれてありがとう。このコメントは長くなりすぎたので、ここに置きます。はい、${NDKROOT}/ndk-build.cmd を使用してネイティブ パーツをビルドします。

ええ、Eclipse がエラーを示してアプリのビルドを開始できないケースに気付きましたが、エラーが発生したファイルを開かずに Eclipse を再起動すると、実際には正常にビルドされます。しかし、エラーがあると思われるファイルを開くと、ビルドを再開できません。そのため、Eclipse によって示されるエラーと実際のエラー (ビルドの妨げ) の間にかなりの不一致があるように見えます。たぶん、示されたエラーに関係なくビルドできるようにする方法を見つける必要がありますが、プロジェクトにエラーがあり、どれが実際のエラーでどれが実際のエラーではないかがわからず、無視する必要があるのは面倒かもしれません...または単に追加するだけですEclipse を快適に保つためにディレクトリを含めるために必要なすべてのもの。

4

1 に答える 1