2011-03-05 4 views
1

Android에서 몇 가지 기본 C++ 프로그램을 실행하기 위해 JNI를 사용하여 Botan (암호화 알고리즘 용 라이브러리) 버전을 빌드하려고합니다.
NDK 도구 체인 (NDK R5b)을 사용하여 오류없이 libbotan.so를 만들 수있었습니다. 내 안드로이드 프로젝트 (예) 나는 다음과 같은 오류를 얻을에서 내 소스 파일 (exampleError.cpp)를 컴파일하고있을 때 는 그러나 다음은JNI를 사용하여 공유 라이브러리에 액세스 할 때 "정의되지 않은 참조"

#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 
} 

: 여기

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입니다 해당 Java 클래스 createError.java : private 네이티브 무효 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 소스/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

진행 했습니까? –

+0

Ups, 내 댓글을 보지 못했습니다. 이제 다 괜찮아요, 다시 한번 감사합니다 :) – Stefan

답변

3

LOCAL_SRC_FILES에는 foo.c 또는 bar.cpp과 같은 실제 파일이 있어야합니다. source.c, .cpp로 끝나지 않기 때문에

당신은 등, 메시지를 받고있어

nm 명령을 밀고 수도

: 아아, 거기있는 모든 기능을 라이브러리로 컴파일된다.

+0

Thanks Matthew - 그게 다예요 :) – Stefan

관련 문제