我试图使用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。 不幸的是,我还没有能够解决我的问题呢。
所以我的问题是:我做错了什么?
你有什么进展吗? – 2011-03-05 20:03:55
Ups,没有看到您的评论。现在一切都很好,再次感谢:) – Stefan 2011-03-06 11:55:57