위에 홈페이지에서 ndk를 다운 받고 적당한 디렉토리에 압축을 푼다.
eclipse에서 프로젝트를 하나 생성한다.
프로젝트 생성시 반드시 minSdkVersion="3"을 추가 해야 한다.
AndroidManifest.xml에 추가한다.
project 폴더에 jni 폴더를 만들다.
ndk/sample/ 폴더에 예제를 참조 하여 Android.mk를 생성한다.
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := gps_serial
LOCAL_SRC_FILES := gps_serial.c \
                   jni_serial.c
LOCAL_LDLIBS := -ldl -llog
include $(BUILD_SHARED_LIBRARY)
jni 폴더에 소스를 생성한다.
gps serial를 읽어 오는 gps_serial.h/c를 생성한다.
//---------------gps_serial.h-----------------------//
#ifndef GPS_SERIAL_H
#define GPS_SERIAL_H
char* read_serial();
#endif  //GPS_SERIAL_H
//---------------gps_serial.c-----------------------//
#include 
#include 
#include 
#include 
#include 
#include 
#define GPS_SERIAL_NODE "/dev/ttyACM0"
#define READ_COUNT 256
#define LOG_TAG "GPS Serial"
#define  LOGI(...)  __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
int fd = -1;
char buf[READ_COUNT];
int openGPS()
{
    LOGI("oepnGPS()");
    if (fd = open(GPS_SERIAL_NODE, O_RDONLY) >= 0) {
        return fd;
    } else {
        LOGI("failed to oepn!");
        return fd;
    }
}
void closeGPS()
{
    LOGI("closeGPS()");
    if (fd)
        close(fd);
    fd = -1;
}
char* read_serial()
{
    int read_count = 0;
    int idx = 0;
    memset(buf, 0x00, READ_COUNT);
    if (fd == -1)
        goto out;
    read_count = read(fd, buf, READ_COUNT);
    LOGI("count %d", read_count);
    LOGI("%s", buf);
    LOGI("read success!!");
out:
    return buf;
}
여기까지는 일반적인 linux 프로그램이다. 단 printf로 메세지를 확인 할 수 없기 때문에 __android_log_print()를 이용하여 log를 확인 해야 한다.
그리고 java와 c library를 연결 할 jni 함수를 만든다.
//---------------jni_serial.c-----------------------/
#include 
#include 
#include 
void Java_com_hardkernel_gpsserial_GPSSerialActivity_openGPS(JNIEnv* env, jobject obj)
{
    openGPS();
}
jstring Java_com_hardkernel_gpsserial_GPSSerialActivity_readGPS(JNIEnv* env, jobject obj)
{
    return (*env)->NewStringUTF(env, read_serial());
}
void Java_com_hardkernel_gpsserial_GPSSerialActivity_closeGPS(JNIEnv* env, jobject obj)
{
    closeGPS();
}
JNI 함수의 이름 규칙은 Java_ 이후에 package name 그리고 jni를 호출 할 class 이름 그리고 함수 이름을 붙여 주면 됩니다.
Java_com_hardkernel_gpsserial_GPSSerialActivity_openGPS
_____패키지이름_______________class 이름_______함수 이름
이제 ndk를 이용하여 build를 해 보자.
jni 폴더에서 [android-ndk가 설치된 폴더]/ndk-build 명령으로 build를 한다.
하고 나면 아래의 그림과 같이 libs 폴더가 생성된다.
//---------------GPSSerialActivity.java-----------------------/
package com.hardkernel.gpsserial;
import com.hardkernel.gpsserial.R;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.widget.TextView;
public class GPSSerialActivity extends Activity {
 private TextView mTv;
 private Thread mReadThread = null;
 private String mString;
 boolean mRunning = false;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        mTv = (TextView)findViewById(R.id.gps_textview);
    }
    @Override
 protected void onPause() {
  // TODO Auto-generated method stub
  super.onPause();
  if (mReadThread != null && mReadThread.isAlive()) {
   Log.w("codewalker", "onPause()");
   mRunning = false;
   mReadThread = null;
  }
  closeGPS();
 }
 @Override
 protected void onResume() {
  // TODO Auto-generated method stub
  Log.w("codewalker", "onResume()");
  super.onResume();
  openGPS();
  if (mReadThread == null) {
   mRunning = true;
   mReadThread = new Thread(new Runnable() {
    public void run() {
     while (mRunning) {
      try {
       Thread.sleep(500);
      } catch (InterruptedException ignore) {
      }
      mString = readGPS();
      mHandler.sendMessage(mHandler.obtainMessage());
     }
    }
   });
   mReadThread.start();
  } 
 }
 @Override
 protected void onDestroy() {
  if (mReadThread != null && mReadThread.isAlive())
   mReadThread.destroy();
  // TODO Auto-generated method stub
  super.onDestroy();
 }
 Handler mHandler = new Handler()
 {
  public void handleMessage(android.os.Message msg)
  {
   mTv.setText(mString);
  };
 };
 public native String readGPS();
 public native void openGPS();
 public native void closeGPS();
 static {
          System.loadLibrary("gps_serial");
 }
}
jni 함수를 위와 같이 등록해 주고 load해 주는 코드를 추가 한다.


