2010-09-20 81 views
2

我正嘗試編譯一個C++庫(VRPN),其中有一些Java包裝將用於Android應用程序。使用ndk-build命令,我的C++接口文件的第一行出現「未定義引用」錯誤,它引用庫中對象的構造函數。我相當確定我的代碼是正確的 - 調用匹配方法頭,並且我有頭文件和源文件來驗證它是否被實現。我認爲問題出在我的Android.mk文件上,該文件目前只引用了我的單個類。因此,代碼似乎可以編譯,但一旦無法找到庫的其餘部分的對象代碼,就不會鏈接。我對C++相當陌生,所以對makefile不太瞭解,但是我所見過的任何「標準」makefile都不符合Android NDK使用的那些,這顯然隱藏了很多細節。如果我理解正確,在一個「標準」makefile中,我只需簡單地命名輸出文件和它需要的對象文件,然後是目標文件及其源文件和頭文件等等。我不知道如何強制ndk-構建以創建目標代碼並鏈接庫的其餘部分。使用JNI將大型C++庫編譯爲Android NDK -makefile問題

這裏是我當前的Android.mk:

LOCAL_PATH := $(call my-dir) 

include $(CLEAR_VARS) 

LOCAL_MODULE := jni_vrpn_button 
LOCAL_SRC_FILES := jni_vrpn_button.cpp 

include $(BUILD_SHARED_LIBRARY) 

jni_vrpn_button.h:

/* DO NOT EDIT THIS FILE - it is machine generated */ 
#include <jni.h> 
/* Header for class jni_VrpnButton */ 

#ifndef _Included_jni_VrpnButton 
#define _Included_jni_VrpnButton 
#ifdef __cplusplus 
extern "C" { 
#endif 
/* 
* Class:  jni_VrpnButton 
* Method: vrpn_Button_initialize 
* Signature: (Ljava/lang/String;J)J 
*/ 
JNIEXPORT jlong JNICALL Java_jni_VrpnButton_vrpn_1Button_1initialize 
    (JNIEnv *, jobject, jstring, jlong); 

/* 
* Class:  jni_VrpnButton 
* Method: vrpn_button_mainloop 
* Signature: (J)V 
*/ 
JNIEXPORT void JNICALL Java_jni_VrpnButton_vrpn_1button_1mainloop 
    (JNIEnv *, jobject, jlong); 

#ifdef __cplusplus 
} 
#endif 
#endif 

jni_vrpn_button.cpp:

#include <unistd.h> 
#include <sys/types.h> 
#include <sys/time.h> 

#include <jni_vrpn_button.h> 
#include <vrpn_Button.h> 
#include <vrpn_Connection.h> 

/* 
* Class:  jni_VrpnButton 
* Method: vrpn_Button_initialize 
* Signature: (Ljava/lang/String;J)J 
*/ 
JNIEXPORT jlong JNICALL Java_jni_VrpnButton_vrpn_1Button_1initialize 
    (JNIEnv * env, jobject, jstring n, jlong conn) 
{ 
const char* name = strdup(env->GetStringUTFChars(n, 0)); 
vrpn_Button_Example_Server * serv = new vrpn_Button_Example_Server(name, (vrpn_Connection *) conn, 1, 1.0); 
return (long) serv; 
} 

/* 
* Class:  jni_VrpnButton 
* Method: vrpn_button_mainloop 
* Signature: (J)V 
*/ 
JNIEXPORT void JNICALL Java_jni_VrpnButton_vrpn_1button_1mainloop 
    (JNIEnv *, jobject, jlong ptr) 
{ 
((vrpn_Button_Example_Server *) ptr)->mainloop(); 
} 

想法?

編輯:忘了發佈錯誤:

$ $CRYSTAX/ndk-build SharedLibrary : libjni_vrpn_button.so /cygdrive/c/Development/android-ndk-r4-windows-crystax-4/android-ndk-r4-crystax/sources/string/obj/l ocal/armeabi/objs/jni_vrpn_button/jni_vrpn_button.o: In function Java_jni_VrpnButton_vrpn_1Button_1 initialize': /cygdrive/c/Development/android-ndk-r4-windows-crystax-4/android-ndk-r4-crystax/sources/string/jni/j ni_vrpn_button.cpp:18: undefined reference to vrpn_Button_Example_Server::vrpn_Button_Example_Serve r(char const*, vrpn_Connection*, int, double)' collect2: ld returned 1 exit status make: *** [/cygdrive/c/Development/android-ndk-r4-windows-crystax-4/android-ndk-r4-crystax/sources/s tring/obj/local/armeabi/libjni_vrpn_button.so] Error 1

回答

3

我想你忘了加上其他cpp文件,因此鏈接器無法找到符號。所以加vrpn_Button.cpp和vrpn_Connection.cpp你的Android.mk:

LOCAL_SRC_FILES := \ 
    jni_vrpn_button.cpp \ 
    vrpn_Button.cpp \ 
    vrpn_Connection.cpp 

這對所有的makefile,即不限於Android的相同。

+0

這就是語法。謝謝! – erock2112 2010-09-22 12:51:39