«Неопределенная ссылка» при доступе к моей общей библиотеке с использованием JNI - PullRequest
1 голос
/ 05 марта 2011

Я пытаюсь создать версию Botan (библиотека для криптографических алгоритмов), используя JNI для запуска нескольких собственных программ на C ++ на Android.
Мне удалось создать libbotan.so без каких-либо ошибок, используя цепочку инструментов NDK (NDK R5b). Но когда я компилирую свой исходный файл (exampleError.cpp) из моего проекта Android (пример), я получаю следующие ошибки:

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

Вот мой примерtrr.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: приватный собственный 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_all.h Источники / botan_all.cpp exampleError.cpp

Я также проверил содержимое файла libbotan.so, которое выглядит следующим образом:

/workspace/Example/obj/local/armeabi$ nm libbotan.so 
00001234 a _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

Но я не знаю, можно ли увидеть какие-либо ошибки в этом выводе. Кроме того, я также искал эту ошибку в Интернете, например, здесь . К сожалению, я еще не смог решить свою проблему.

Так что мой вопрос: что я делаю не так?

1 Ответ

3 голосов
/ 05 марта 2011

LOCAL_SRC_FILES должен иметь фактические файлы, такие как foo.c или bar.cpp.

Вы получаете сообщение, потому что source не заканчивается на .c, .cpp и т. Д.

Команда nm могла бы вас предупредить: увы, в вашей библиотеке нет функций, скомпилированных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...