3

Androidで古いC++コードを使用してラッパーを作成しようとしています。

エラーをコンパイルすると、次のように表示されます。

In file included from /usr/local/android/android-ndk-r8b/sources/cxx-stl/gnu-libstdc++/4.6/include/bits/stl_algobase.h:61:0,
                 from /usr/local/android/android-ndk-r8b/sources/cxx-stl/gnu-libstdc++/4.6/include/bits/stl_tree.h:63,
                 from /usr/local/android/android-ndk-r8b/sources/cxx-stl/gnu-libstdc++/4.6/include/map:60,
                 from /home/vocalize/source/xxxxxxxxxxxxxxxxxxxxx/Lxxxxxxx.h:9,
                 from /home/vocalize/source/xxxxxxxxxxxxxxxxx/jni/cxxx_wrap.c:3:
/usr/local/android/android-ndk-r8b/sources/cxx-stl/gnu-libstdc++/4.6/include/bits/functexcept.h:43:1: error: unknown type name 'namespace'
/usr/local/android/android-ndk-r8b/sources/cxx-stl/gnu-libstdc++/4.6/include/bits/functexcept.h:44:1: error: expected ',' or ';' before '{' token

私は次のMakefile.mkを使用しています

include $(CLEAR_VARS)
LOCAL_C_INCLUDES := $(MY_LIB_DIR)include

LOCAL_CFLAGS += -DHAVE_CONFIG_H
LOCAL_CFLAGS += -DANDROID_NDK

LOCAL_PATH := $(BASE_PATH)
LOCAL_MODULE := cxxxx_lib

LOCAL_SRC_FILES := cxxxx_wrap.c

LOCAL_STATIC_LIBRARIES := my_lib
LOCAL_LDLIBS := -llog 

include $(BUILD_SHARED_LIBRARY) 

これらのエラーを修正するにはどうすればよいですか?

4

1 に答える 1

6

cxxx_wrap.c.cファイルであるC++ .hファイルがからインクルードされています。コンパイラは、ソースファイルの拡張子を使用して言語を検出します。したがって、Cを想定し、C++固有の構文を窒息させています。

cxxx_wrap.cの名前を.cppまたは.cxxに変更します。#include "Lxxxxxxx.h"または、線を。で囲み#ifdef __cplusplus/#endifます。-x c++または、コンパイラオプションを指定してC++コンパイルを強制します。

実行したら、cxxx_wrap内のすべてのJNIメソッドがJNIEXPORTで宣言されているか、で囲まれていることを確認してくださいextern "C" {}。そうしないと、Javaランタイムはそれらを検出しません。

ちなみに、.hファイルの名前を.hppに変更しても効果はありません。

于 2012-11-01T12:27:23.297 に答える