2011-03-05 79 views
1

我試圖使用JNI爲Android上運行一些本機C++程序構建Botan(用於加密算法的庫)的一個版本。
我已經設法創建一個libbotan.so使用NDK工具鏈(NDK R5b)沒有任何錯誤。 但是,當我從我的Android項目(例)我收到以下錯誤編譯我的源文件(exampleError.cpp):當使用JNI訪問我的共享庫時出現「未定義的引用」

Android NDK: WARNING: Unsupported source file extensions in /home/fensta/workspace 
/Example/jni/Android.mk for module botan  
Android NDK: sources  
Android NDK: WARNING: Unsupported source file extensions in /home/fensta/workspace 
/Example/jni/Android.mk for module botan  
Android NDK: sources  
Install  : libbotan.so => libs/armeabi/libbotan.so 
Compile++ thumb : fooBar <= exampleError.cpp 
SharedLibrary : libfooBar.so 
/home/fensta/workspace/Example/obj/local/armeabi/objs/fooBar/exampleError.o: In 
function `LibraryInitializer': 
/home/fensta/workspace/Example/jni/botan/botan_all.h:5593: undefined reference to ` 
Botan::LibraryInitializer::initialize(std::basic_string<char, std::char_traits<char>, 
std::allocator<char> > const&)' 
/home/fensta/workspace/Example/obj/local/armeabi/objs/fooBar/exampleError.o: In 
function `~LibraryInitializer': 
/home/fensta/workspace/Example/jni/botan/botan_all.h:5595: undefined reference to ` 
Botan::LibraryInitializer::deinitialize()' 
/home/fensta/workspace/Example/jni/botan/botan_all.h:5595: undefined reference to ` 
Botan::LibraryInitializer::deinitialize()' 
/home/fensta/workspace/Example/obj/local/armeabi/objs/fooBar/exampleError.o: In 
function `~LibraryInitializer': 
/home/fensta/Programs/android-ndk-r5b/sources/cxx-stl/stlport/stlport 
/stl/_string_base.h:156: undefined reference to ` 
Botan::LibraryInitializer::deinitialize()' 
collect2: ld returned 1 exit status 
make: *** [/home/fensta/workspace/Example/obj/local/armeabi/libfooBar.so] Error 1 

這裏是我的exampletError.cpp:

#include <jni.h> 
#include <string> 
#include <botan/botan_all.h> 
using namespace Botan; 

JNIEXPORT void JNICALL Java_test_example_example_simpleTestCall (JNIEnv *env, jobject 
object){ 
    LibraryInitializer init;// <- calling a random type from Botan fails 
} 

這裏是相應的Java類createError.java: private native void simpleTestCall();

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    ... 
    simpleTestCall(); 
} 

在這裏你可以看到Android.mk:

LOCAL_PATH := $(call my-dir) 
include $(CLEAR_VARS) 
LOCAL_MODULE := libbotan 
LOCAL_CPPFLAGS += -fexceptions 
LOCAL_SRC_FILES := sources 
LOCAL_C_INCLUDES := includes 
include $(BUILD_SHARED_LIBRARY) 

include $(CLEAR_VARS) 
LOCAL_MODULE := fooBar 
LOCAL_SRC_FILES := exampleError.cpp 
LOCAL_SHARED_LIBRARIES:= 
libbotan          
LOCAL_CPPFLAGS += -fexceptions 
include $(BUILD_SHARED_LIBRARY) 

最後,但並非最不重要的Application.mk:

APP_ABI := armeabi armeabi-v7a 
APP_PROJECT_PATH := /home/fensta/workspace/Example 
APP_STL := stlport_shared 

注:JNI文件夾的結構如下所示: Android.mk Application.mk botan/botan_all.h sources/botan_all.cpp exa mpleError.cpp

我還檢查是如下libbotan.so的內容:

/workspace/Example/obj/local/armeabi$ nm libbotan.so 
000a _DYNAMIC 
000012bc a _GLOBAL_OFFSET_TABLE_ 
000012c8 A __bss_end__ 
000012c8 A __bss_start 
000012c8 A __bss_start__ 
000012c8 D __data_start 
000012c8 A __end__ 
00000233 A __exidx_end 
00000233 A __exidx_start 
000012c8 A _bss_end__ 
000012c8 A _edata 
000012c8 A _end 

但我不知道是否有可能在這個輸出中看到任何錯誤。 此外,我也在網上搜索這個錯誤,例如here。 不幸的是,我還沒有能夠解決我的問題呢。

所以我的問題是:我做錯了什麼?

+0

你有什麼進展嗎? – 2011-03-05 20:03:55

+0

Ups,沒有看到您的評論。現在一切都很好,再次感謝:) – Stefan 2011-03-06 11:55:57

回答

3

LOCAL_SRC_FILES應該有實際的文件,如foo.cbar.cpp

你得到一個消息,因爲source.c.cpp結束等

nm命令可能已經放倒你了:唉,沒有任何功能被編譯到您的圖書館。

+0

感謝馬修 - 它工作:) – Stefan 2011-03-06 11:03:52

相關問題