서적에 관한 질문 및 오류 등을 문의 할 수 있으며, 저자로부터 직접 답변을 받을 수 있습니다.
디바이스드라이버를 이용하여 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);
}
};
----------------------------------------
이렇게 진행하고 있는데 제가 놓친 부분이 있을까요?