1

ファースト.h

#ifndef FIRST_H
#define FIRST_H

class Test
{
public:
void create();
void test();

private:


};



#endif /* FIRST_H */

Second.cpp

#include "first.h"


#ifdef __cplusplus
extern "C" {
#endif

jint

Java_com_example_ndkcpp2_MainActivity_stringFromJNI( JNIEnv* env,
                                                  jobject thiz )
{
    Test t;
    t.test();

}

#ifdef __cplusplus
}
#endif

second.cpp で NDK-Build を実行すると、

pp2/jni/second.cpp:44: エラー: 'Test::test()' への未定義の参照 collect2: ld が 1 つの終了ステータスを返しました

4

2 に答える 2

0

C++ を使用して、クラスを .h ファイルで宣言し、実装を .cpp ファイルに記述します。たとえば、First.h を作成した場合は、First.cpp を作成して、メソッドの実装を次のように記述しますvoid Test::test(){}。コンパイルのために Makefile (Android.mk) に First.cpp を忘れずに追加してください。

于 2013-09-17T02:44:06.300 に答える
0

Test クラスを正しく実装した first.cpp ファイルがあると仮定すると、ここには複数のオプションがあります。あなたの Android.mk を見ることができないので、すべてのオプションを調べます。

First.cpp を静的ライブラリまたは共有ライブラリとしてビルドし、このライブラリをモジュールに追加して、Second.cpp をコンパイルします。Android.mk は次のようになります。

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := firstlib
LOCAL_C_INCLUDES := path/to/first.h
LOCAL_SRC_FILES := first.cpp
include $(BUILD_STATIC_LIBRARY)

First を静的ライブラリではなく共有ライブラリにしたい場合は、include $(BUILD_STATIC_LIBRARY) 行を次のように変更します。

include $(BUILD_SHARED_LIBRARY)

これで、2 番目のライブラリは次のようにコンパイルされます。

include $(CLEAR_VARS)

LOCAL_MODULE    := second
LOCAL_C_INCLUDES := path/to/first.h
LOCAL_C_INCLUDES += path/to/second.h
LOCAL_SRC_FILES := second.cpp
LOCAL_STATIC_LIBRARIES := firstlib

include $(BUILD_SHARED_LIBRARY)

firstlib が共有ライブラリとしてビルドされている場合は、LOCAL_STATIC_LIBRARIES += firstlib 行を次のように変更してリンクできます。

LOCAL_SHARED_LIBRARIES += firstlib

2 番目の解決策として、first.cpp を 2 番目のライブラリの一部としてビルドできます。この方法では、最初のライブラリへのリンクについて心配する必要はありません。これは、デザインの選択に似ており、ライブラリをどのように形成したいかです。

include $(CLEAR_VARS
LOCAL_MODULE    := libtwolib-second
include $(CLEAR_VARS)

LOCAL_MODULE    := libtwolib-second
LOCAL_C_INCLUDES := path/to/first.h
LOCAL_C_INCLUDES += path/to/second.h
LOCAL_SRC_FILES := first.cpp
LOCAL_SRC_FILES += second.cpp

include $(BUILD_SHARED_LIBRARY)

最後に、NDK ディレクトリの samples/twolibs の下に、最初のアプローチのサンプルがあります。

于 2013-09-17T06:06:26.770 に答える