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

디바이스드라이버를 이용하여 LED를 동작하려 했는데요 우선적으로 binder가 정상 동작하는지 알아보려고 하는데요

아래와 같은 문제가 생겼습니다.


자바어플 라디오버튼에서 클릭을 누르면 커널에서 0 이나 1값을 printf()로 출력해볼려고 하는데요

전에 문제라고 생각되던 디바이스드라이버관련한것은 주석처리하였고

터미널에서 상태확인하기위해 LOGE에 printf()를 추가했습니다.


** ledService.cpp

static int fd;
    static struct sigaction oldact;
    static pthread_key_t sigbuskey;

    int LEDService::instantiate()
    {
        LOGE("LEDService instantiate.");
        printf("LEDService instantiate.\n");
        int r = defaultServiceManager()->addService(String16("hybridego.LED"), new LEDService());
        LOGE("LEDService r = %d\n", r);
        printf("LEDService r = %d\n", r);//ok
        return r;
    }


LEDService::LEDService()
    {   
        LOGE("LEDService created.");
        printf("LEDService created.\n");//ok
        mNextConnId = 1;
        pthread_key_create(&sigbuskey, NULL);
    }

status_t        LEDService::onTransact(uint32_t code, const Parcel & data, Parcel * reply, uint32_t flags)
    {
        printf("onTransact\n"); <----여기까지 터미널에서 찍히는것을 보려고합니다.
        int err;
        int msgtype = 0;
        switch (code)
        {

           .......


** ledservice.cpp

int
main(int argc, char **argv)
{
    sp < ProcessState > proc(ProcessState::self());
    sp < IServiceManager > sm = defaultServiceManager();
    LOGI("ServiceManager: %p", sm.get());
    printf("ServiceManager: %p\n", sm.get());
    LEDService::instantiate();
    LOGE("ledservice started");
    printf("ledservice started\n");
    ProcessState::self()->startThreadPool();
    IPCThreadState::self()->joinThreadPool();
    printf("ledservice end\n");
}


**ledClient.cpp

namespace       android
{
    //sp binder;
    sp < IBinder > binder;
    void            LED::setN(int n)
    {
        Parcel          data,
                        reply;
                       
                        data.writeInt32(getpid());
                        data.writeInt32(n);
                        binder->transact(0, data, &reply);
                       
                        int32_t d1 = data.readInt32();
                        int32_t r1 = reply.readInt32();
                       
                        LOGE("data = %d, reply = %d", d1, r1);
                        return;
    }

    const void      LED::getLEDService()
    {
        sp < IServiceManager > sm = defaultServiceManager();
        binder = sm->getService(String16("hybridego.LED"));
        LOGE("LED::getLEDService %p\n", sm.get());
        if (binder == 0)
        {
            LOGW("LEDService not published, waiting...");
            return;
        }
    }

};                              // namespace

**led.cpp

jint Java_org_test_led_LEDActivity_ledfromJNI (JNIEnv * env, jobject thiz, jint led) {
    int a=led;
    LED *gg = new LED;
    gg->setN(a);

    return a;
}

------------------------------------

위소스상태에서 빌드를 한후에 ledservice를 실행시키고


root@android:/system/bin # ./ledservice
LEDService instantiate.
LEDService created.
LEDService r = 0
ledservice started


여기까지 터미널에 출력이 됩니다.

후에 어플을 실행하여 On 버튼을 누르면 Unfortunatley, app has stopped. 메시지가 뜨면서 어플이 종료


터미널에 아래메시지가 추가로 출력이 되더라구요

binder: 2488: binder_alloc_buf, no vma
binder: 1305:1626 transaction failed 29201, size 104-0
binder: 2488: binder_alloc_buf, no vma
binder: 1305:1626 transaction failed 29201, size 104-0


마지막 자바어플이 동작이 이상한지 테스트를 해봤는데요 

LED_Control(a) 함수를 주석해서 테스트를 하면 라디오버튼이 정상동작되는것을 확인했습니다.


OnClickListener radio_listener = new OnClickListener() {
       
        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            name = name + ": "+Integer.toString(a);
            Toast.makeText(MainActivity.this, name, Toast.LENGTH_SHORT).show();
            LED_Control(a); <--------해당라인 주석해제 후에 어플만 실행하면 정상동작잘됨
           
        }


LED_Control 연결되는 함수를 봤는데요

static{
        System.loadLibrary("ledclientjni");
    }
   
    private native int ledfromJNI(int on_off);<-----JNI 함수에서 먼가 작동이 안되는것 같은생각인데요
   
    public void LED_Control(int a){
        int k = ledfromJNI(a);
        Log.d("LED", "result : " + k);
       
    }


    };


----------------------------------------

이렇게 진행하고 있는데 제가 놓친 부분이 있을까요?



biokk

2015.01.22 00:04:21
*.7.19.42

binder_alloc_buf, no vma 관련검색하면 binder.c 소스에서 메시지를 출력하는것 같은데
해당 바인더 메모리가 할당되지 않은 상태인것 같은데..

645 static struct binder_buffer *binder_alloc_buf(struct binder_proc *proc, 646 size_t data_size, 647 size_t offsets_size, int is_async) 648 { 649 struct rb_node *n = proc->free_buffers.rb_node; 650 struct binder_buffer *buffer; 651 size_t buffer_size; 652 struct rb_node *best_fit = NULL; 653 void *has_page_addr; 654 void *end_page_addr; 655 size_t size; 656 657 if (proc->vma == NULL) { 658 pr_err("%d: binder_alloc_buf, no vma\n", 659 proc->pid); 660 return NULL; 661 }

biokk

2015.01.22 01:48:33
*.7.19.42

이클립스 logcat을 보니깐

java.lang.UnsatisfiedLinkError : ledfromJNI 라고 나오는데


static{
        System.loadLibrary("ledclientjni");
    }

호출이 제대로 안되는게 아닐까요?

전호철

2015.01.25 20:24:55
*.172.200.192

그렇게 나오면 libledclientjni.so를 못찾는 것 같은데요.

라이브러리 build 해서 제대로 넣어주신건 맞나요?

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

ndk를 이용하여 일반 안드로이드 어플을 만들수가 있나요? [3]

  • biokk
  • 2015-07-25
  • 조회 수 1034

3장 계산기 에러 file [2]

ndk 라이브러리추가 하는 질문입니다 [8]

  • ice179
  • 2015-02-11
  • 조회 수 833

ndk onTransact 함수에 대한 질문인데요 [1]

  • ice179
  • 2015-02-07
  • 조회 수 258

ledservice , 라이브러리 추가 관련한 질문입니다 [3]

  • ice179
  • 2015-02-04
  • 조회 수 347

ndk 함수에서 c언어 동작은 onTransact 에서만 동작하나요? [3]

  • ice179
  • 2015-02-03
  • 조회 수 369

android binder 의 onTransact(uint32_t code, ...)의 code값은 ... [1]

  • ice179
  • 2015-01-29
  • 조회 수 311

gpio 컨트롤 예제질문입니다. [3]

  • biokk
  • 2015-01-21
  • 조회 수 668

gpio 컨트롤관련하여 ledservice 가 바로 죽어 버리는현상이 나오는... [2]

  • biokk
  • 2015-01-17
  • 조회 수 243

안드로이드 ndk gpio컨트롤 하기 질문입니다. [2]

  • ice179
  • 2015-01-16
  • 조회 수 442

pluscalc 질문입니다. [1]

아..권한 하고 마운트 에서 막혀버리네요..ㅜㅜ [1]

다시 질문 드립니다.ㅜㅜ apk 설치문제입니다. [3]

hoffplay 컴파일 질문 입니다. [2]

hoplayer_core 질문입니다. [2]

ffmpeg 빌드관련 질문드립니다 file [6]

hoffplay 빌드시 sec_format.h / SEC_OMX_Def.h 없다고 나옵니다. [3]

너무 자주 질문드리는 것 같아 죄송해요 ^^; [1]

ffmpeg 빌드에러 [2]

동영상 파일을 열때 avformat_open_input문 사용문의 [2]

사용자 로그인