반응형
NDK의 native-activity를 보다가 보니 gingerbread의 framework에 nativeactivity를 띄워주는 부분이 생긴것 같다.
아직 플랫폼쪽 소스를 보지 않아서 확실히는 모르겠는데 일단 NDK의 흐름을 보니
이쪽에 연결해주는 부분이 따로 생긴것 같다는 생각이 든다.

1. android create project 또는 이클립스로 프로젝트를 만든다.

2. AndroidManifest.xml을 만든다.

      <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.native_activity"
        android:versionCode="1"
        android:versionName="1.0"> 
       
        <uses-sdk android:minSdkVersion="8" />
        
        <!-- 지금 만들 .apk는 자바 코드를 포함하고 있지 않기 때문에 hasCode에 false로 한다. -->
        <application android:label="@string/app_name" android:hasCode="false">

        <!-- 이 액티비티는 NativeActivity framework class 에 내장된다. -->        
          <activity android:name="android.app.NativeActivity"
            android:label="@string/app_name"
            android:configChanges="orientation|keyboardHidden">
       
          <meta-data android:name="android.app.lib_name"
            android:value="native-activity" />
            <intent-filter>
              <action android:name="android.intent.action.MAIN" />
              <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
          </activity>
        </application>
      </manifest>


activity 태그의 android:name 속성은 반드시 android.app.NativeActivity 로 지정하고
meta-data 태그의 android:name 는 android.app.lib_name 으로 하고 아래에다가 라이브러리 이름을 지정해준다. lib 랑 .so 빼고 쓴다.

3. ANativeActivity_onCreate() 함수를 구현한다. 액티비티가 시작될 때 호출된다.
이 함수는 ANativeActivity 구조체 포인터를 받는다. 여기에는 여러가지 콜백 포인터가 포함되어 있는데 이것을 각각 구현해준다.

4. ANativeActivity->instance 를 채워준다.

5. 액티비티가 시작될 때 필요한 것들을 구현한다.

6. 각각의 액티비티 라이프 싸이클에 맞게 콜백을 구현한다. 중요한것은 콜백이 blocking 모드로 되면 절대 안된다. 블록킹 모드가 되면 UI thread가 콜백이 리턴되기를 기다리기 때문에 ANR(Application Not Responding) 이 발생하게 된다.

7. 어플의 나머지를 개발한다.

8. Android.mk를 작성한다.
jni/ 디렉토리 아래에 넣는다.
대충 아래와 같이 만들면 된다.


       LOCAL_PATH := $(call my-dir)
       include $(CLEAR_VARS)
       LOCAL_MODULE    := my_native_module
       LOCAL_SRC_FILES := my_native_code.c
       include $(BUILD_SHARED_LIBRARY)

9. ndk-build 를 이용해서 빌드한다.

10. Ant 또는 eclipse를 이용해서 apk 를 만들어 낸다.
      ANT 다운로드 : http://ant.apache.org/bindownload.cgi 


$(call import-module,android/native_app_glue)
는 NDK_MODULE_PATH environment variable 에 등록되어 있는 모듈 리스트에서 모듈 이름으로 모듈을 찾아서 Android.mk 를 포함시켜 준다.
그리고 이것은 맨 마지막 줄에 쓰는것을 추천한다.
마지막이 아닐 경우에 중간에 쓰게 되면 Android.mk 가 엉망진창이 된다.




<ndk_root>/platforms/android-9/arch-arm/usr/include/android/native_activity.h
이것을 완벽하게 구현해주면 된다.

 <ndk_root>/sources/android/native_app_glue/android_native_app_glue.c
이걸 사용하면 좀 쉬워진다.

native_activity.h
의 다음을 구현해야 된다.
extern ANativeActivity_createFunc ANativeActivity_onCreate;

 <ndk_root>/sources/android/native_app_glue/android_native_app_glue.c
에 보면



이렇게 구현된 것을 볼 수 있따.

android_app_create 를 따라가보면

중간에 쓰레드를 띄운다.

    pthread_create(&android_app->thread, &attr, android_app_entry, android_app);


android_app_entry 로 가보면 

extern void android_main(struct android_app* app);

이것을 실행하게 되어 있는데

이것이 이제 우리가 작성할 부분이 된다.

이놈이 실제 어플 구현부분이 된다.

android_main 은 main.c에 있다.

android_app 에다가 필요한것들을 등록해준다.

android_app 구조체는 android_native_app_glue.h 에 있다.
반응형

'Android > NDK' 카테고리의 다른 글

jni 객체 필드에 접근하기  (0) 2011.07.28
JNI에서 한글 문제...  (0) 2011.03.18
Bionic C Library Overview (Android NDK)  (0) 2011.03.17
Posted by Real_G