2013-09-16 62 views
1

First.h的Android NDK的C++類未定義的引用

#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,構建

PP2/JNI/second.cpp:44:error:未定義引用'Test :: test()' collect2:ld返回1退出狀態

+0

你在哪裏定義'Test :: test'?你如何指定要鏈接的文件? –

+0

檢查此鏈接:http://stackoverflow.com/questions/5292190/using-android-ndk-and-c – user1502952

+0

我在first.h文件中定義它吧?測試應該是頭等艙的成員功能。 – lilzz

回答

0

使用C++,在.h文件中聲明Class並在.cpp文件中寫入實現。例如,您創建了First.h,那麼您應該創建First.cpp,在其中編寫您的方法實現,如void Test::test(){}。請記住將First.cpp添加到您的生成文件(Android.mk)進行編譯。

0

假設您有一個first.cpp文件,並且您正確實施了Test類,那麼您有多個選項。無法看到您的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) 

如果您想首先是一個共享庫,而不是一個靜態庫,改變包括$(BUILD_STATIC_LIBRARY)線:

include $(BUILD_SHARED_LIBRARY) 

現在,您的第二LIB被編譯爲如下:

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被構建爲共享庫,則可以通過chaning LOCAL_STATIC_LIBRARIES + = firstlib線到下面的鏈接它:

LOCAL_SHARED_LIBRARIES += firstlib 

作爲第二種解決方案,您可以將first.cpp構建爲第二個庫的一部分,這樣您就不必擔心與第一個庫鏈接。這更像是一個設計選擇,以及如何你想塑造你的庫:

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目錄中的第一種方法的樣本,樣本下/ twolibs。

相關問題