กันยายน 21, 2017, 10:05:20 am *
ยินดีต้อนรับคุณ, บุคคลทั่วไป กรุณา เข้าสู่ระบบ หรือ ลงทะเบียน
ส่งอีเมล์ยืนยันการใช้งาน?

เข้าสู่ระบบด้วยชื่อผู้ใช้ รหัสผ่าน และระยะเวลาในเซสชั่น
   หน้าแรก   ช่วยเหลือ เข้าสู่ระบบ สมัครสมาชิก  
หน้า: [1]   ลงล่าง
  พิมพ์  
ผู้เขียน หัวข้อ: Android-NDK Development for C Programmers  (อ่าน 4423 ครั้ง)
0 สมาชิก และ 1 บุคคลทั่วไป กำลังดูหัวข้อนี้
ShadowMan
Administrator
Hero Member
*****
ออฟไลน์ ออฟไลน์

เพศ: ชาย
กระทู้: 8264


ShadowWares


| |
« เมื่อ: ธันวาคม 08, 2012, 08:14:23 pm »

Android-NDK Development for C Programmers บทความนี้ไม่เหมาะสำหรับผู้เริ่มต้น

ขั้นตอนต่างๆ จะสมมุติว่าผู้อ่านมีความรู้เรื่องการพัฒนา Android ด้วย SDK มาแล้ว และต้องการจะผันตัวเองมาเล่น C เพื่อเพิ่มความเร็วของการทำงานของโปรแกรม รวมไปถึงคนที่ต้องการจะเล่น Graphics หนักบน Android


0) สิ่งที่ต้องทำการติดตั้งเพิ่มลงไปคือ Cygwin เพื่อใช้จำลองสภาพการทำงานระบบ Linux (แนะนำให้อ่านที่นี่ เฉพาะเรื่องการติดตั้ง Cygwin ก็พอ)

1) ทำการสร้างโปรเจ็คใหม่ ในที่นี้ผมจะกำหนด :
   - Application Name และ Project Name เป็น "nativec"
   - Package Name เป็น "com.shadowwares.santi.nativec"
   - Activity Name เป็น "MainActivity"
   - Layout Name เป็น "main"


จากนั้นทำการสร้าง UI ง่ายๆ แบบนี้



2) ที่ Package Exploer ของ Eclipse ให้สร้างโฟลเดอร์ใหม่ชื่อ "jni" และในโฟลเดอร์นี้ให้สร้างไฟล์สองตัวคือ:
   - Android.mk
   - cfunction.c
และเขียน code ลงไปดังนี้:


Android.mk
Code:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE    := ndklib
LOCAL_SRC_FILES := cfunction.c
include $(BUILD_SHARED_LIBRARY)

cfunction.c
Code: (c)
#include <string.h>
#include <jni.h>

jstring Java_com_shadowwares_santi_nativec_MainActivity_cNativeFunction(JNIEnv* env, jobject javaThis) {
  return (*env)->NewStringUTF(env, "This message is generated by cNativeFunction()");
}


3) เปิด Cygwin ขึ้นมาและ cd ไปยังตำแหน่งที่ save project ไว้ ในที่นี้ผม save ไว้ที่ "C:\Users\Santi\workspace\nativec"
Code:
cd /cygdrive/c/users/santi/workspace/nativec

4) ทำการ compile โดยใช้ ndk-build ในที่นี้ android-ndk ของผมอยู่ที่ "C:\Users\Santi\Desktop\AndroidDevelopment\android-ndk-r8c"
Code:
/cygdrive/C/Users/Santi/Desktop/AndroidDevelopment/android-ndk-r8c/ndk-build

ผลจาก 3) และ 4) แสดงตามรูป

ความหมายคือทำการ compile ไฟล์ "cfunction.c" ไปเป็น static library ที่ชื่อ "ndklib" และได้สร้าง dynamic link library ที่ชื่อ "libndklib.so" ซึ่งไฟล์นี้ได้เก็บไว้ที่ "libs/armeabi"
"armeabi" เป็นตัวบอกว่า libary นี้ได้ถูก compile สำหรับ ARM ในกรณีที่ใช้ CPU แบบอื่นๆ เช่น x86 จะต้องทำการกำหนดเพิ่มเติมใน Android.mk ในที่นี้จะไม่กล่าวถึง


5) เขียนโปรแกรม Java เพิ่มเติมที่ไฟล์ MainActivity.java สุดท้ายแล้วจะได้:
Code: (java)
package com.shadowwares.santi.nativec;
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity {

   Button button = null;
   TextView textview = null;

   private native String cNativeFunction();

   static {
      System.loadLibrary("ndklib");
   }

   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);

      button = (Button) findViewById(R.id.bt);
      textview = (TextView) findViewById(R.id.tv);
      button.setOnClickListener(new View.OnClickListener() {
         @Override
         public void onClick(View v) {
            String returned_str = cNativeFunction();
            textview.setTextColor(Color.RED);
            textview.setText(returned_str);
         }
      });
   }
}


ส่วนที่เกี่ยวข้องกับการใช้งาน Native มีสองส่วนคือ:
Code: (java)
   private native String cNativeFunction();

   static {
      System.loadLibrary("ndklib");
   }

ส่วนนี้เป็นการประกาศ prototype function และดึง Library เข้ามาใช้งานแบบ run-time

อีกส่วนคือ:
Code: (java)
      String returned_str = cNativeFunction();

ส่วนนี้เป็นการเรียกใช้งาน ฟังก์ชั่นที่เขียนขึ้นโดยภาษาซี ซึ่งในที่นี้คือ cNativeFunction() นั่นเอง

6) ทดลองรันดูผล จะได้แบบนี้ นั่นหมายความว่า Java คุยกับ C Library รู้เรื่องแล้วนั่นเอง


หากจะหาเหตุผลดีๆ ให้ตัวเองสักข้อว่าทำไมต้อง C ลองเขียนโปรแกรมคำนวณ อะไรง่ายๆ เช่นหาค่า Factorial ของตัวเลขค่าเยอะๆ หรือคำนวณทางคณิตศาสตร์หนักๆ (อาจจะให้วนลูปทำหลายๆ รอบ) โดยที่ code ตัวหนึ่งเขียนจาก C และอีกตัวหนึ่งเขียนจาก Java จานั้นนำเวลาที่ได้จาก Java หารด้วยเวลาที่ได้จาก C จะมีตัวเลขที่น่ากลัวอยู่ตัวหนึ่ง ตัวเลขตัวนี้จะดึงดูดใจให้หันไปหา C ทันที (หากคนคนนั้นสนใจเรื่องความเร็ว)

ขอจบเท่านี้ครับ การใช้เครื่องมือไม่ใช่เรื่องยากเลยใช่ไหม ที่ยากคือจะเขียน C ยังไงตะหาก  smiley
บันทึกการเข้า

By SDW: Do No Wrong Is Do Nothing
          If you want to increase your success rate, double your failure rate
ShadowMan
Administrator
Hero Member
*****
ออฟไลน์ ออฟไลน์

เพศ: ชาย
กระทู้: 8264


ShadowWares


| |
« ตอบ #1 เมื่อ: ธันวาคม 19, 2012, 05:47:14 pm »

Google I/O 2011: Bringing C and C++ Games to Android

<a href="http://www.youtube.com/v/5yorhsSPFG4&amp;rel=0" target="_blank">http://www.youtube.com/v/5yorhsSPFG4&amp;rel=0</a>
บันทึกการเข้า

By SDW: Do No Wrong Is Do Nothing
          If you want to increase your success rate, double your failure rate
หน้า: [1]   ขึ้นบน
  พิมพ์  
 
กระโดดไป: