'native build'에 해당되는 글 1건

  1. 2008.02.17 Android에서 Native Build 방법
아래의 문서는 Android가 공식적으로 NDK를 지원하지 않았을때의 문서이다.
NDK는 아래의 URL에서 다운로드 가능하다.
http://developer.android.com/sdk/ndk/1.5_r1/index.html

공식적으로 Android는 Native 빌드를 지원하지 않는다.
http://code.google.com/android/kb/general.html#c
Can I write code for Android using C/C++?
No. Android applications are written using the Java programming language.

하지만 커널까지 공개되었고 JNI 인터페이스까지 지원되는 입장에서 못할 것은 없는것 같다.

Davanum Srinivas의 블로그를 확인하면 JNI를 이용하여 Native 빌드된 바이너리를 실행하는 방법을 소개하고 있다. 내용은 다음과 같다.

NativeAdd.java class 생성

package org.apache;

import android.util.Log;

public class NativeAdd {
    static {
        try {
            Log.i("JNI", "Trying to load libNativeAdd.so");
            System.loadLibrary("NativeAdd");
        }
        catch (UnsatisfiedLinkError ule) {
            Log.e("JNI", "WARNING: Could not load libNativeAdd.so");
        }
    }

    public static native long add(long a, long b);
}

javah로 해더 파일 생성
javah -classpath ../../android.jar;../bin/classes; org.apache.NativeAdd
생성된 해더

/* DO NOT EDIT THIS FILE - it is machine generated */
#include
/* Header for class org_apache_NativeAdd */

#ifndef _Included_org_apache_NativeAdd
#define _Included_org_apache_NativeAdd
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class:     org_apache_NativeAdd
* Method:    add
* Signature: (JJ)J
*/
JNIEXPORT jlong JNICALL Java_org_apache_NativeAdd_add
  (JNIEnv *, jclass, jlong, jlong);

#ifdef __cplusplus
}
#endif
#endif

C코드로 구현부 작성

include "org_apache_NativeAdd.h"

JNIEXPORT jlong JNICALL Java_org_apache_NativeAdd_add
  (JNIEnv *env, jclass c, jlong a, jlong b)
{
    return a + b;
}

Cross comfiler로 빌드

arm-none-linux-gnueabi-gcc  -I/usr/lib/jvm/java-1.5.0-sun/include -I/usr/lib/jvm/java-1.5.0-sun/include/linux  -fpic -c org_apache_NativeAdd.c
arm-none-linux-gnueabi-ld -T armelf_linux_eabi.xsc -shared -o libNativeAdd.so org_apache_NativeAdd.o

컴파일러는 아래의 링크에서 다운로드가 가능하며 armelf_linux_eabi.xsc는 motz diary에서 설명하고 있는 Patch된 파일을 사용해야 링크에러가 발생되지 않는다.
http://www.codesourcery.com/gnu_toolchains/arm/download.html


Android로 업로딩

adb push native/libNativeAdd.so /system/lib
adb install bin/CallNative.apk

참고로 테스트 환경은 Ubuntu였으며 Windows 환경에서는 빌드되지 않았다.

Posted by NOP 트랙백 0 : 댓글 0