서적에 관한 질문 및 오류 등을 문의 할 수 있으며, 저자로부터 직접 답변을 받을 수 있습니다.

책에 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로 작성하여 라이브러리 테스트까지 해보고 안드로이드에서 테스트한 상태입니다


공류라이브러리 링크시키면 에러나는데 원인을 모르겠네요

책 내용에 보면 외부라이브러리 활용하기부분이 있는데 정적라이브러리를 링크하여 안드로이드에 사용해야 하는것인가요?


김정권

2015.02.11 05:00:16
*.131.177.146

C++ 맹글링 문제로 보이네요.

C는 링크할 함수이름이 그대로인데,

C++은 오버로딩 때문에 컴파일함수 이름이 인자 변수형태 갯수를 변형해 붙입니다.

즉, C++에서 찾는 함수는 test_add@????? 어쩌고 저쩌고라 못 찾습니다.


add.h를 아래와 같이 편집해야 합니다. (그래야, C++이 얘는 이름을 그냥그대로 찾아야 되는구나 압니다.)

#ifdef __cplusplus
extern "C" {
#endif


int test_add(int a, int b);


#ifdef __cplusplus
}
#endif


ice179

2015.02.11 17:34:56
*.223.22.89

맹글링 문제 같지않습니다..

add.h 아래와 같이 사용중입니다.


#ifndef ADD_L_H
#define ADD_L_H
#ifdef __cplusplus
extern "C" {
#endif
int test_add(int a, int b);
#ifdef __cplusplus
}
#endif

#endif // ADD_H

전호철

2015.02.11 22:22:13
*.162.60.30

libadd.so 를 하나 더 만들어서 libledclientjni.so 에서 연결하셨다는건가요?

그럴경우 JAVA에서 연결된 라이브러리까지 모두 추가해주셔야 합니다.


 책쓴지가 하도 오래되서 확실하지 않지만 아마 책에 썼던걸로 기억을 하는데....  (빼먹었나..)

ice179

2015.02.12 07:43:02
*.127.16.63

libledclientjni.so를 만들때 libadd.so를 추가하였습니다. LOCAL_STATIC_LIBRARIES에 libadd.a 로 라이브러리를 추가하니 정상동작하고 있습니다

ice179

2015.02.12 17:42:56
*.223.26.172

좀 이상한게

LOCAL_STATIC_LIBRARIES에서 추가하니 정상동작하는데


LOCAL_SHARED_LIBRARIES 변수로 libadd를 추가하면 logcat에

Fatal signal 11 (SIGSEGV) at 0x41c179b8 (code=2)   이라고 나오는데요

shared에서 동작이 안되는 이유가 있을가요?





전호철

2015.02.13 01:13:48
*.162.60.30

java 에서 libadd 까지 로드하고 해보세요.

ice179

2015.02.13 02:18:52
*.223.26.172

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로 해결이 안되네요;;

전호철

2015.02.13 03:10:13
*.162.60.30

이상하네요. 그렇게 하면 원래 되야 되는데..

올려주신 에러메세지도 관련없는 데서 나오는거 같은데.


혹시라도 모르니 library 들을 앱에 포함해보세요.

List of Articles
번호 제목 글쓴이 날짜 조회 수

사용자 로그인