すべてのndkサンプルでは、ヘッダのexternとして宣言され、cppファイルで定義された基本的なC関数しか使用しません。その後、jniコールバックを含むCファイルにヘッダファイルをインクルードした後、すべて正常に動作します。AndroidでC++を使用するndk/jni
android ndkでC++クラスを使用することはできますか?私のアプリケーションはネイティブのアクティビティではなく、まだ重要なJavaの部分を持っていますが、CPU集約的な計算のためのネイティブCコード(クラスやその他のC++のもので既にC++で書かれています)を呼び出します。ここで
今のstrcutureように私のハローの世界です:
ファイル "first.h"
#ifndef FIRST_H
#define FIRST_H
class Test
{};
#endif /* FIRST_H */
ファイル "second.cpp"
#include <jni.h>
#include "first.h"
#ifdef __cplusplus
extern "C" {
#endif
jint Java_com_example_twolibs_TwoLibs_add(JNIEnv* env,
jobject this,
jint x,
jint y)
{
Test t;
return 0;
}
#ifdef __cplusplus
}
#endif
そして最後にAndroid.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := libtwolib-second
LOCAL_SRC_FILES := second.cpp
include $(BUILD_SHARED_LIBRARY)
プレッテ基本的ですがコンパイルされません。 .cファイルでsecond.cppを有効にすると、ヘッダファイルをインクルードするときにエラーが発生します。これは、C++ファイルではないためです。
error: expected '=', ',', ';', 'asm' or '__attribute__' before 'Test'
次のエラーを発生させた.cppそれを作る:
make: *** No rule to make target `/cygdrive/c/android-ndk-r5c/samples/twolibs/jni/second.c', needed by `/cygdrive/c/android-ndk-r5c/samples/two-libs/obj/local/armeabi/objs/twolib-second/second.o'. Stop.
私はその事をコンパイルすることができますどのように任意のアイデア?
おかげ
コールバックCコード(Java側から呼び出されるJava_com_example_twolibs_TwoLibs_addのような呼び出しを含むファイル)は.cファイル(.cppではなく)になければなりません。さもなければ私のマシンでコンパイルされません。したがって、クラス宣言を含むヘッダファイルをインクルードしようとすると、同じエラーが発生します。 – user745189
すべてを.cppファイルに変換すると、makeは次のようになります。***ターゲットエラーを作るルールはありません。つまり、makeファイルはソースファイルを見つけることができませんでしたが、.cファイルに変換するとそうなります – user745189
コンパイルが必要ですが、すべてのJNI関数に 'external" C "'を追加する必要があります。 makefileのソースファイル拡張子を変更しましたか? – Michael