서적에 관한 질문 및 오류 등을 문의 할 수 있으며, 저자로부터 직접 답변을 받을 수 있습니다.
책에 5장 GPIO 컨트롤 하기 소스를 가지고 테스트를 해보았는데요
ledclient/Android.mk 파일에 라이브러리(so)를 추가했습니다
-----------------ledclient/Android.mk--------------------------
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := eng
LOCAL_DEFAULT_CPP_EXTENSION := cpp
LOCAL_PRELINK_MODULE:=false
LOCAL_MODULE := libledclientjni
LOCAL_SRC_FILES := \
ledClient.cpp \
led.cpp
LOCAL_SHARED_LIBRARIES := \
libcutils \
libutils \
libbinder \
libadd <-----------------------libadd.so 파일 라이브러리 추가
LOCAL_C_INCLUDES += \
$(JNI_H_INCLUDE)
include $(BUILD_SHARED_LIBRARY)
-------------------------------------------------------------
led.cpp파일에서 라이브러리 관련 소스를 추가작성하였습니다
---------------------------------------led.cpp---------
#include <jni.h>
#include <stdio.h>
#include <stdlib.h>
#include <utils/Log.h>
#include "ledClient.h"
#include "../include/add.h" <--------헤더추가
using namespace android;
#ifdef __cplusplus
extern "C" {
#endif
jint Java_com_example_ledtest1_MainActivity_ledfromJNI (JNIEnv * env, jobject obj, jint led) {
int a=led;
LED *gg = new LED;가
gg->setN(a);
printf("aa\n");
test_add(1,2); <-------------------------------libadd.so 파일 함수 실행
return a;
}
#ifdef __cplusplus
}
#endif
-------------------------------------------------------------
이렇게만 추가후에 mm으로 정상 빌드 실행 시켜서 adb logcat에서 출력을 봤는데요
아래 출력 내용입니다
I/DEBUG ( 1193): bea7aac4 50133f9f /system/lib/libc.so
I/BootReceiver( 1305): Copying /data/tombstones/tombstone_05 to DropBox (SYSTEM_TOMBSTONE)
I/ActivityManager( 1305): Process com.example.ledtest1 (pid 1901) has died.
W/NetworkManagementSocketTagger( 1305): setKernelCountSet(10046, 0) failed with errno -2
D/Zygote ( 1196): Process 1901 terminated by signal (11)
W/ActivityManager( 1305): Force removing ActivityRecord{414ef780 com.example.ledtest1/.MainActivity}: app died, no saved state
D/dalvikvm( 1305): GC_CONCURRENT freed 121K, 12% free 11561K/13063K, paused 2ms+4ms
W/InputManagerService( 1305): Window already focused, ignoring focus gain of: com.android.internal.view.IInputMethodClient$Stub$Proxy@41665e50
I/ActivityManager( 1305): No longer want com.android.contacts (pid 1573): hidden #16
W/ThrottleService( 1305): unable to find stats for iface rmnet0
D/dalvikvm( 1305): GC_CONCURRENT freed 934K, 15% free 11150K/13063K, paused 8ms+14ms
--------------------
logcat에 보면 위와 같은 에러가 나는데요 제가 라이브러리 링크를 잘못 한것인가요?
안드로이드보드에도 /system/lib/libadd.so 에 추가한 상태입니다.
libadd.so 파일은
int test_add(int a, int b)
{
return a+b;
}
이렇게 구성된 라이브러리파일이구요 c로 작성하여 라이브러리 테스트까지 해보고 안드로이드에서 테스트한 상태입니다
공류라이브러리 링크시키면 에러나는데 원인을 모르겠네요
책 내용에 보면 외부라이브러리 활용하기부분이 있는데 정적라이브러리를 링크하여 안드로이드에 사용해야 하는것인가요?
Android.mk
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := eng
LOCAL_DEFAULT_CPP_EXTENSION := cpp
LOCAL_PRELINK_MODULE:=false
LOCAL_MODULE := libledclientjni
LOCAL_SRC_FILES := \
ledClient.cpp \
led.cpp \
LOCAL_CFLAGS += -Wall -g
LOCAL_STATIC_LIBRARIES := \
#libadd \ <------------- static 으로 하면 정상동작합니다.
LOCAL_SHARED_LIBRARIES := \
libcutils \
libutils \
libbinder \
libadd \ <--------shared로 선언하니 에러
LOCAL_C_INCLUDES += \
$(JNI_H_INCLUDE) \
$(LOCAL_PATH)/../include
include $(BUILD_SHARED_LIBRARY)
include $( call import-module, libadd )
java 에서는
static{
System.loadLibrary("add");
System.loadLibrary("ledclientjni");
Log.d("JNI","System.loadLibrary func call");
}
이렇게 한 상태이구요
Android.mk 에서 static으로 설정
java에서 System.loadLibrary("add"); 주석처리 후에 빌드하면 정상동작하는데
shared설 정하고 System.loadLibrary("add"); 추가하여 실행시키면 앱이 죽어 버리는현상이 나오더라구요;;
여러가지 검색해서 해보고 있는데;; shared로 해결이 안되네요;;
C++ 맹글링 문제로 보이네요.
C는 링크할 함수이름이 그대로인데,
C++은 오버로딩 때문에 컴파일함수 이름이 인자 변수형태 갯수를 변형해 붙입니다.
즉, C++에서 찾는 함수는 test_add@????? 어쩌고 저쩌고라 못 찾습니다.
add.h를 아래와 같이 편집해야 합니다. (그래야, C++이 얘는 이름을 그냥그대로 찾아야 되는구나 압니다.)
#ifdef __cplusplus
extern "C" {
#endif
int test_add(int a, int b);
#ifdef __cplusplus
}
#endif