ผู้สนับสนุน

วันศุกร์ที่ ๓๐ ตุลาคม พ.ศ. ๒๕๕๒

Android NDK(เขียนเล่นๆ)

Android NDK

• จำเป็นต้องมี SDK 1.5
• บน windows จำเป็นต้องลง http://www.cygwin.com/ (จะมี  gmake และ gcc มาให้)
• ทำให้เขียน c/c++ เพื่อรันบน android ได้
• native code จะถูกเรียกใช้ผ่าน JNI
• เขียนไม่ดีจะกลายเป็นว่าซับซ้อนกว่าเดิมโดยใช่เหตุเพราะว่ามันต้องรันบน dalvik VM อีกชั้นอยู่แล้ว
• ในอนาคต code ของ native อาจจะใช้ไม่ได้บ้างบางส่วนเพราะว่ามันมียังมีการปรับอยู่เรื่อยๆ
• ต้องเขียน android.mk และ application.mk เองด้วย
• c++ ใช้ .cpp เป็นพื้นฐาน สามารถ config ให้รับ .cxx อื่นๆ ได้
• ประกอบด้วย
    ∘ cross-toolchains  ( compilers, linker, etc) ที่สามารถสร้าง native ARM binaries บน Linux, OSX, Windows(ที่มี Cygwin)


NDK แบบคร่าวๆ
หลังจากโหลด ndk มาและแตกไฟล์ออกมาจะมีโครงสร้าง dir ดังนี้

code c/c++ จะเขียนใน dir sources/ และเมื่อ compile แล้วจะได้ผลออกมาที่ dir out/ และ apps/
โดย
  • code ที่เขียนออกมาจะไม่ได้กลายเป็น app โดยตรง
  • เมื่อ compile แล้วมันจะสร้าง lib native ให้อยู่ใน apps/
  • เรียกผ่าน JNI ของ android อีกทีหนึ่ง 

    จากรูป libs/armeabi/lib[name].so เป็นสิ่งที่เมื่อ compile code c/c++ แล้ว NDK จะสร้างให้ และ dir อื่นๆ  src/, assets/ , res/ , bin/, gen/ เป็นสิ่งที่ต้องสร้างขึ้นมาโดยเป็น project android ทั่วไปโดยจะเรียกใช้ native c/c++ ผ่านทาง lib เท่านั้น
    โดยที่เราจะต้องเขียน Application.mk (makefile) และ AndroidManifest.xml เพิ่มเติมเองเพื่อให้มันเรียกใช้ได้


    sources/ จะมี Android.mk ที่เป็นตัวกำหนดว่าต้อง build หรือ compile ไฟล์ใด dir ใดบ้าง เพราะฉะนั้นมันจะมีอยู่แทบทุก subdir
สำหรับ code ของ c/c++ ที่เขียนใน sources จะมีลักษณะที่ทำไว้ให้  jni เรียกได้ด้วย แล้วไฟล์ที่ว่านั้นอาจจะไปเรียก code c อื่นๆ ก็ได้
** second.c **
#include "first.h" // เรียกใช้ func อื่น
#include <jni.h> // เรียก jni

jint
Java_com_example_twolibs_TwoLibs_add( JNIEnv*  env, // Java_com_example_twolibs_TwoLibs_ < คือชื่อ pkg และ class, add คือชื่อ method
                                      jobject  this,
                                      jint     x,
                                      jint     y ) // argument พื้นฐานคือ JNIEnv*  env,jobject  this argument เพิ่มเติมคือ jint x, jint y
{
    return first(x, y);    // เรียกใช้ function จากไฟล์อื่น (first.c)
}

** first.c **
#include "first.h"

int  first(int  x, int  y)
{
    return x + y;
}

** first.h **
#ifndef FIRST_H
#define FIRST_H

extern int first(int  x, int  y);

#endif /* FIRST_H */
หมายเหตุ  Java_com_example_twolibs_TwoLibs_add <<คือ JNI นี่เอง

และจะเรียกใช้ผ่าน JNI ได้ในลักษณะนี้
package com.example.twolibs;

import ...


public class TwoLibs extends Activity
{
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        /* do something */
        int       x  = 1000;
        int       y  = 42;
        // dynamically load the library at runtime
        // before calling the native method.
        System.loadLibrary("twolib-second");
        int  z = add(x, y);

        /* show z output */
    }

    public native int add(int  x, int  y);
}

STABLE lib ที่สามารถเรียกใช้ได้
C standard, <stdlib.h>, <stdio.h>, etc...  และ <pthread.h><math.h>
C++ <cstddef>   <new>   <utility>   <stl_pair.h>

C lib เฉพาะของ android <android/log.h>

Zip
<zlib.h> <zconf.h>
เริ่มใช้ android NDK
1. ตรวจสอบ system requirement
  • SDK 1.5
  • GNU Make 3.81 ขึ้นไป ทดสอบโดยการ พิมพ์ make -v
2. Download NDK แล้วทำการรัน setup script
    build/host-setup.sh
3. เขียน source แล้วเก็บไว้ที่ source/<mysrc>/...
4. เขียน sources/<mysrc>/Android.mk เพื่ออธิบาย source code ให้ NDK build ได้ถูกต้อง
    - เขียน source code
5. เขียน apps/<myapp>/Application.mk เพื่ออธิบายโปรแกรม และ native code มันจำเป็นต้องใช้กับ  NDK build system
   - เขียน app ที่เรียก native code
6. Build Native code ด้วย คำสั่ง make APP=<myapp> ที่ root dir ของ NDK
7. Generate .apk ด้วย Eclipse
Configurating the NDK





ไม่มีความคิดเห็น:

แสดงความคิดเห็น