티스토리 툴바


Network 2011/01/21 13:41

Advanced Encryption Standard (AES)

AES는 802.11 무선 시스템의 TKIP를 대체하기 위해 고안된 고급 차세대 암호화 알고리즘입니다.


DHCP(Dynamic Host Configuration Protocol):

DHCP는 네트워크 상의 모든 컴퓨터에 대한 TCP/IP 설정을 자동으로 구성하는 프로세스입니다.


Extensible Authentication Protocol (EAP):

EAP는 인증 서버, 액세스 지점(AP), 무선 클라이언트간에 보안 인증 데이터 교환을 가능하게 해 주는 802.1x 표준입니다. EAP에는 EAP MD5, EAP-Tunneled TLS (EAP-TTLS), Lightweight EAP (LEAP), Protected EAP (PEAP)와 같은 다수의 변형 표준이 있습니다.


IP 주소:

IP 주소는 인터넷 또는 로컬 네트워크 상의 각 컴퓨터에 대한 고유한 ID를 제공합니다. IP 주소는 보통 마침표로 구분된 네 개의 숫자 조합으로 표시됩니다(예: 169.254.10.2). 어떤 숫자도 255보다 클 수 없습니다. 각 이더넷 인터페이스에 IP 주소가 하나씩 있습니다. Dell 무선 USB 어댑터의 경우 LAN 이더넷 인터페이스가 있으므로, LAN IP 주소가 있는 것입니다.


LAN(Local Area Network):

LAN은 장소에 한정된 네트워크입니다. 그 지역의 네트워크 사용자는 파일, 프린터 및 기타 서비스를 공유할 수 있습니다.


TCP/IP(Transmission Control Protocol/Internet Protocol):

TCP/IP란 컴퓨터가 인터넷 상에서 통신하는 데 사용하는 프로토콜입니다. TCP는 다른 컴퓨터로 보내기 위해 데이터를 "패킷"이라는 작은 단위로 쪼개는 방법과 수신하는 컴퓨터에서 패킷들을 하나의 파일로 다시 모으는 방법을 결정합니다. IP는 인터넷을 통해 패킷이 라우팅되는 방법을 결정합니다. 인터넷 프로토콜(IP)을 참조하십시오.


Temporal Key Integrity Protocol (TKIP):

티킵이라 발음하는 Temporal Key Integrity Protocol은 WEP의 차세대입니다. TKIP은 패킷 단위 키 혼합, 메시지 완전성 확인, 매케니즘 재작성 기능을 제공하여 WEP의 결함을 수정합니다.


WEP(Wired Equivalent Privacy):

WEP 데이터 암호화는 (i) 유사한 무선 LAN 장비를 사용하는 "침입자"가 네트워크에 액세스하는 것과 (ii) 무단으로 무선 LAN 트래픽을 캡처하는 것을 차단하기 위해 802.11 표준에 따라 정의된 암호화 방식입니다. WEP를 사용하면 관리자가 WEP 암호화 알고리즘을 통해 전달되는 "키 문자열"을 기준으로 각 무선 네트워크 사용자에 대한 개별 "키" 집합을 정의할 수 있습니다. 지정된 키가 없는 사용자의 액세스는 모두 거부됩니다.


Wireless Protected Access (WPA):

WPA는 WEP를 통한 무선 네트워크의 보안을 향상시키기 위해 고안된 업계 지원 사양입니다. 이는 역동적 키 사용 등 WEP의 문제를 수정하는 Temporal Key Integrity Protocol (TKIP)과 Advances Encryption Standard (AES)를 활용합니다.


Wireless Protected Access with Pre-Shared Key (WPA-PSK):

WPA-PSK는 인증 서버를 사용하지 않는 WPA 버전입니다. 클라이언트와 액세스 지점이 알고 있는 암호 확인 구문을 사용하여 인증을 실행합니다.


WLAN(무선 LAN):

WLAN은 유선이 아닌 고주파수 라디오파를 사용하여 네트워크 클라이언트와 장치들 사이에서 통신하고 데이터를 전송하는 LAN의 일종으로, 유선 LAN의 확장 또는 대체 수단으로 구현된 유연한 데이터 통신 시스템입니다. LAN과 마찬가지로 범위 내의 네트워크 사용자는 파일, 프린터 및 기타 서비스를 공유할 수 있습니다.


WPA2(Wireless Protected Access):

WPA2는 무선 네트워크를 위한 WPA의 후속 보안 방식으로서 보다 강력한 데이터 보호 및 네트워크 액세스 제어를 제공합니다. WPA2는 엔터프라이즈 및 소비자 Wi-Fi 사용자들에게 인증된 사용자들만 해당 무선 네트워크를 액세스할 수 있는 높은 수준의 보증을 제공합니다. WPA2는 TKIP(Temporal Key Integrity Protocol), CKIP(Cisco Key Integrity Protocol) 및 AES(Advances Encryption Standard)를 이용합니다.


WPA2-PSK(Wireless Protected Access 2 with Pre-Shared Key)

WPA2-PSK는 인증 서버를 사용하지 않는 WPA2 버전입니다. WPA2-PSK는 클라이언트와 액세스 지점 둘 다에 알려진 통과 문구를 사용하여 인증을 설정합니다.


가상 LAN(VLAN):

VLAN은 실제로는 LAN의 다른 세그먼트에 있을 수 있지만 동일한 유선에 연결되어 있는 것처럼 작동하는 컴퓨터 네트워크입니다. VLAN은 하드웨어가 아닌 소프트웨어를 통해 구성되므로 유연성이 아주 뛰어납니다. VLAN에서는 컴퓨터를 물리적으로 다른 위치로 옮기는 경우 하드웨어를 다시 구성하지 않고도 동일한 VLAN에 그대로 남아 있을 수 있습니다.


네트워크 어댑터:

네트워크 어댑터는 컴퓨터와 네트워크 사이를 물리적으로 연결하는 장치 확장 카드입니다. 네트워크 어댑터로는 랩톱용 PC 카드, 사운드 카드나 모뎀 카드를 설치하는 것과 같이 컴퓨터의 슬롯에 끼워지는 카드, 내장 카드, 내장 USB 어댑터, USB 어댑터, USB 데스크톱 어댑터 등 다양한 종류가 있습니다. 일부 신형 컴퓨터에는 네트워크 어댑터가 기본 장착되어 있습니다. PC 카드나 데스크톱의 슬롯에 끼워지는 카드는 종종 네트워크 인터페이스 카드 또는 NIC라고 합니다.


네트워크 이름(SSID):

액세스 지점은 ESSID라는 ID에 따라 그룹으로 분류됩니다. ESSID는 Net ID라고도 하며, 네트워크 환경에 적합한 문자나 숫자로 조합된 ID입니다. ESSID는 액세스 지점에만 전용으로 사용되는 ID입니다. 피어-투-피어 네트워크를 언급할 때는 ESSID란 용어를 사용할 수 없습니다.

서비스 집합 ID(SSID)는 무선 네트워크를 구성하는 컴퓨터와 장비를 모두 고유하게 식별하는 32자의 보다 일반적인 이름입니다. SSID의 한 종류가 ESSID입니다. 기본 서비스 집합 ID(BSSID)도 SSID의 한 종류입니다. BSSID는 무선 어댑터나 액세스 지점의 MAC 주소입니다.


도메인 이름 시스템(또는 서비스) (DNS):

DNS는 도메인 이름을 IP 주소로 변환하는 인터넷 서비스입니다. DNS 서버는 호스트 컴퓨터의 데이터베이스, 해당 도메인 이름 및 IP 주소를 관리합니다. 도메인 이름이 요청되면 DNS 서버가 이 데이터베이스를 사용하여 올바른 IP 주소로 사용자를 보냅니다.

DNS 시스템은 실제 그 자체가 네트워크입니다. 한 DNS 서버가 특정 도메인 이름을 변환하는 방법을 모르면 올바른 IP 주소가 반환될 때까지 계속해서 다른 서버에게 질의합니다.


링크 표시등:

링크 표시등은 네트워크 장치에서 양호한 네트워크 연결을 나타내는 표시등입니다. 허브의 경우 포트별로 링크 표시등이 하나씩 있지만 링크 표시등으로 사용되지 않고 다른 정보를 표시할 수도 있습니다. 네트워크 활동 중에는 표시등이 자주 깜박입니다. 일부 허브는 10 Mbps 및 100 Mbps 속도에 대해 다른 색의 등을 켭니다. 자세한 내용은 사용하는 제품과 함께 제공되는 설명서를 참조하십시오.


무선 광대역 라우터:

"가정용 무선 게이트웨이" 또는 "SOHO(소호) 라우터 및 액세스 지점"이라고도 하는 무선 광대역 라우터는 여러 PC를 하나의 광대역(케이블 또는 DSL) 모뎀에 연결하는 장치로, 이 라우터를 사용하여 인터넷 액세스 권한을 공유하고 PC들 사이에서 파일을 공유하고 프린터와 같은 네트워크 장치에 대한 액세스 권한을 공유할 수 있습니다.


암호화:

암호화는 보안을 구현하고 정보를 보호하는 일반적인 방법입니다. 암호화는 알고리즘이라는 일련의 명령을 정보에 적용합니다. 명령들은 단순한 텍스트 형태의 정보를 암호화 키라 불리는 16진 숫자 조합과 결합합니다.

무선 클라이언트나 액세스 지점은 공중파를 통해 정보를 전송하기 전에 정보를 암호화 또는 스크램블합니다. 정보를 수신하는 액세스 지점 또는 무선 클라이언트는 동일한 키를 사용하여 정보를 해독하거나 스크램블을 해제합니다. 올바른 암호화 키를 갖고 있는 WLAN 장치만이 정보를 읽을 수 있습니다. 키 길이가 길수록 암호화 기능이 강화됩니다.

802.11a/b/g-호환 무선 네트워크는 WEP(Wired Equivalent Privacy) 기술과 상호 호환성이 있습니다. WEP 암호화 방법에는 64(40)비트 암호화와 128비트 암호화 두 가지가 있습니다. 40비트 암호화와 64비트 암호화는 동일합니다. 일부 공급업체는 40비트 용어를 사용하고 다른 공급업체는 64비트 용어를 사용합니다. 40비트 암호화를 사용하는 무선 장치와 64비트 암호화를 사용하는 장치는 서로 호환됩니다. 64(40)비트 키는 16진 숫자 10개로 구성되며, 두 자리 숫자 조합 5개가 다음과 같은 형식으로 배열됩니다.

키 #1: 1A:2F:3A:44:23
키 #2: 23:44:56:65:78
키 #3: 01:23:3F:FF:DE
키 #4: 00:11:22:33:44

128비트 키에서 가능한 키 조합 수는 64(40)비트 키 조합 수의 수 조배입니다. 이 키는 16진 숫자 26개로 구성되며, 두 자리 숫자 조합 13개가 다음과 같은 형식으로 배열됩니다:

키 #1: 1A:2F:3A:44:23:22:22:34:44:55:1A:12:13
키 #2: 23:44:56:65:78:3A:44:23:22:22:34:44:55
키 #3: 01:23:3F:FF:DE:23:44:56:65:78:3A:44:11
키 #4: 00:11:22:33:44:AA23:3F:FF:DE:23:44:56

WLAN의 모든 무선 클라이언트와 액세스 지점은 동일한 암호화 방법과 키를 사용해야 합니다.


액세스 지점:

무선 광대역 라우터 또는 주거용 게이트웨이라고도 합니다. 액세스 지점은 데이터를 수신하여 재송신하는 802.11 무선 네트워크 장치입니다. 이 장치를 통해 무선 네트워크 어댑터가 설치된 컴퓨터를 이더넷 네트워크(일반적으로)에 연결할 수 있습니다.


이더넷:

이더넷은 가장 널리 사용되는 LAN 기술로, Xerox에서 처음 개발하고 1980년 DEC, Intel 및 Xerox에 의해 공식화된 업계 표준입니다. 이더넷 네트워크는 지정된 프로토콜을 사용하여 10/100Mbps 속도로 데이터를 전송합니다.


이더넷 주소(MAC 주소):

이더넷 주소는 사전 프로그램되어 제공되는 고유한 주소로, MAC(Media Access Control) 주소라고도 합니다. 이더넷 네트워크의 각 컴퓨터는 고유한 이더넷 주소를 가집니다. 12자리 16진 주소로, 제조 과정에서 컴퓨터의 네트워크 어댑터 회로에 인코딩됩니다. 네트워크의 다른 장치는 이 주소를 사용하여 해당 컴퓨터를 식별합니다. 이 주소는 TCP/IP 네트워크의 컴퓨터에 할당되는 IP 주소와 같지 않습니다. 네트워크에서 IP 주소는 MAC 주소와 함께 네트워크 통신을 가능하게 합니다.


인증:

클라이언트와 액세스 지점이 무선 네트워크를 통해 통신할 수 있는 권리를 상호 확인하는 프로세스.


인터넷 프로토콜(IP):

IP는 인터넷 상에서 컴퓨터들 사이에 데이터를 전송하는 데 사용되는 프로토콜입니다. IP 프로토콜은 인터넷 컴퓨터가 네트워크에 있는 각 컴퓨터의 IP 주소를 지속적으로 추적하는 방법과 IP 주소들 사이에 데이터 패킷을 라우팅하는 방법을 설명합니다.


클라이언트:

클라이언트는 네트워크에 연결된 컴퓨터입니다.


포트:

포트는 네트워킹 장치 중 네트워크 케이블을 연결하는 데 사용되는 커넥터입니다. 허브와 스위치에는 네트워크의 컴퓨터에 연결하는 수많은 포트가 있습니다.


프로토콜:

프로토콜은 네트워크에서 정보를 보내고 받는 데 적용되는 일련의 규칙입니다. 이 규칙이 전송되는 데이터의 형식과 오류 감지 및 수정 방법과 같은 그 밖의 네트워킹 측면을 결정합니다. 각 컴퓨터의 프로토콜 드라이버는 정보를 주고 받을 때 이 규칙을 준수하는 소프트웨어입니다. 이러한 드라이버를 프로토콜이라고도 합니다.

저작자 표시

'Network' 카테고리의 다른 글

용어정리  (0) 2011/01/21
posted by ssuk1010
Android 2011/01/18 10:51
사용자 삽입 이미지


저작자 표시
posted by ssuk1010
Android 2010/12/30 16:18

출처 :http://shchoi82.springnote.com/pages/6150375

우선 NDK는 Native Developmet Kit의 약자입니다.

자바의 JNI기술을 사용하여 안드로이드 app(java)와 안드로이드 library(c/c++)계층을 연결해주는 역할을 합니다.

 

윈도우에서 사용 cygwin에서 사용하는 방법예제입니다.

 

1. NDK를 다운로드

   아래의 http://developer.android.com에서 ndk-android-r4b 를 다운받는다.

   ※ r4b의 r은 revision 4번째 버젼이라는 의미입니다.

       2010년 7월 30일 최신버젼이 r4b 이군요

그림1.png

 

 

2. cygwin설치

   아래의 www.cygwin.com에서 다운로드

그림3.png

 

그림4.png

 

   cygwin은 설치 인터넷 접속해서 다운로드후 설치됩니다.

   GNU awk또는 Nawk 와 GNU Make 3.81이상이 같이 설치되어야 합니다.

   awk는 이미 default에 들어가 있구요 make만 체크하시고 설치합니다.

   install 하시면 됨, 저는 이미 설치되어 있기때문에 Keep이라고 나오는군요

 

 

3. cygwin 환경설정

그림6.png

 

~/.vimrc파일 수정

 

그림5.png

ndk-build명령은 어디서든 실행하기 위해 PATH환경변수에 추가시켜줍니다.

위의파일은 ~/.bash_profile입니다.

※ /(루트)의 cygwin 디렉토리는 윈도우의 "내컴퓨터"와 같은경로입니다.

    android-ndk-r4b의 경로를 적절하게 넣어주시면 됩니다.

 

예제 소스 빌드

그림7.png

sample파일 디렉토리에서 

프로젝트 루트 또는 프로젝트\jni 폴더에서 ndk-build 하시면 빌드가 됩니다.


간단한 예제 실습

1. 액티비티 레이아웃구성 

   텍스트뷰 하나와 버튼하나 추가

그림8.png

 

2. 액티비티 구현

버튼클릭으로 jni를 호출하는 소스를 onCreate에 간단하게 구현 해봤습니다.

그림9.png

 

3. 간단한 클래스 만들기

   간단하게 native 함수가 들어가있는 NativeCall 클래스를 생성

   native 키워드는 javah가 헤더파일을 생성할때 참조하게 되는 키워드입니다. 구현부가 없습니다.

   ※ static 부분은 class의 객체가 생성될때 (new) 되어질때 호출됩니다. "my_lib"은 ndk-build로 생성된 라이브러리 이름입니다. 파일명은  libmy_lib.so 입니다.

그림10.png

 

 

4.  javah실행 헤더파일을 만듭니다.

    아래에 보시면 bin폴더에서 실행하고 있는것을 볼수 있습니다.

    javah는 내부적으로 ./ssu/os/android/NativeCall.class 파일을 참고하여 헤더파일을 생성하게됩니다.

    하위디렉토리를 페키지에 맞춰진 경로에 class파일 존재해야합니다.

 

    헤더파일명은 페키지명과 클래스명을 참고해서 아래와같이 생성됩니다.

    -o 옵션을 사용하면 파일명을 지정할수 있습니다.

    프로젝트 경로 밑에 jni 폴더를 생성하고 파일을 옮겨줍니다.

   

   

그림11.png

 

 생성된 헤더파일의 내용

 native 키워드로 되어있던 함수들이 jni형태 함수 프로토타입을 확인할수 있습니다.

 복잡해보이지만 C문법입니다.

※ ifdef __cpluscplus 에서보듯이 c++도 지원됩니다.

그림12.png

 

5. 함수구현

  my_lib.c 파일을 만들어 함수를 구현합니다.

  두게의 함수가 있는대 하나는 단순하게 string을 리턴해줍니다.

  다른 하나는 두정수를 입력받아 더한후 리턴.

그림13.png

 

6. Android.mk파일 작성

   기존의 hello jni 샘플의 파일을 가져와서 작성합니다.

   수정된내용은 LOCAL_MODULE , LOCAL_SRC_FILES 이 바뀌었습니다.

   LOCAL_MODULE에는 라이브러리 명을 써주시면 되고

   LOCAL_SRC_FILES는 작성하신 C소스 파일명을 넣어주시면 됩니다.

그림14.png

 

7. ndk-build

   프로젝트루트나 jni 경로에서 ndk-build명령을 실행합니다.

그림15.png

 

libs 폴더가 생성되고 라이브러리 .so파일이 생성된것을 확인할수 있습니다.

그림16.png

 

8. 에뮬레이터 실행

    위의 과정이 정상적으로 진행되었으면 아래와 같이 실행됩니다.

    버튼을 누르면 jni가 호출되어 스트링을 가져와 textview에 뿌려줍니다.

 

 그림20.png


저작자 표시
posted by ssuk1010
Android 2010/12/30 13:45

Android에서 JNI 프로그램 작성

From DISLab

Jump to: navigation, search

Contents

[hide]

JNI 프로그램 작성을 위한 개발 환경 셋팅

  • JNI를 사용하기 위해서는 윈도우즈와 리눅스에서 개발환경을 셋팅할 수 있다.
  • 리눅스와 윈도우즈 둘의 차이점은 cygwin 설치 밖에 없음.
  • Android SDK, Android NDK, Cygwin 프로그램이 시스템에 설치되었고 ADT가 Eclipse에 설치되었다면 Android 프로젝트에서 JNI(Java Native Interface)를 이용하여 C, C++언어에서 작성된 공유 라이브러리(*.so)를 로드하고 포함된 함수를 호출할 수 있는 프로그램을 작성할 수 있다.


리눅스에서의 개발환경 셋팅


윈도우즈에서의 개발환경 셋팅

Cygwin 설치

  • Cygwin 이란 ? 윈도우 시스템에서 Linux와 비슷한 환경을 만들어주는 프로그램
  • Cygwin 설치방법
    1. setup.exe 파일 실행 - install from internet 선택
    2. Root 경로 지정 & install For All Users
    3. Download 받을 패키지가 저장될 경로 지정(Select Local package Directory)
    4. Internet 연결 - Direct connection 선택
    5. Download Site 선택 - ftp://ftp.kaist.ac.kr
    6. Progress - 패키지 목록을 가져옴 --> 처음 설치할 경우 설치할 패키지를 선택할 수 있다는 알림창 뜸
    7. 설치할 수 있는 패키지 목록이 대화창에 출력됨, 필요한 것 선택 Devel/gcc-g++, Devel/gcc-core, Devel/make, Editor/vim
      • 나중에 다시 필요한 패키지 설치할 수 있음. 선택한 패키지의 크기에 따라 시간이 좀 걸린다.
      • 설치화면
      • ㅣ설치화면
    8. 시작메뉴에 Cygwin Bash Shell 메뉴 생성된 것 확인 . 설치 완료
      • Cygwin Bash Shell 화면
      • Cygwin Bash Shell 화면
      • 더 설치하고 싶은 패키지가 있으면 다시 setup.exe 파일을 실행시켜 동일한 방법으로 다운받으면 된다.


Android NDK 설치

  • NDK Download 받기
    • URL : http://developer.android.com/sdk/ndk/index.html
    • Android developers 사이트에 가면 SDK 페이지 좌측에 메뉴에 Native Development Tools 메뉴에서 NDK 선택
    • Download the Android NDK 에서 자신의 개발환경에 맞는 OS 선택 - 이 페이지의 설명은 Windows 기반임.
    • Download the Android NDK Webpage
    • ㅣDownload the Android NDK Webpage


  • NDK 설치하기
    • 다운받은 android-ndk-r4.zip 파일을 Cygwin이 설치된 폴더 안의 Home에 복사
    • copy path - C:/cgywin/home/계정명/ 밑에 복사해줌
    • Android NDK Path 설정
    • ㅣAndroid NDK Path 설정


  • 다운로드 받아서 Path만 지정해주면 NDK를 사용하기 위한 절차는 끝


Hello JNI Example

  • NDK 설치가 끝나면 테스트해보기 위한 Sample Code가 있다. Sample Code 중 HelloJni를 구동하는 절차를 설명한다.
  • 윈도우즈 환경 셋팅에서 설치한 cgywin을 사용하여 NDK 빌드를 할 수 있다.

NDK 빌드

  • Cygwin Bash Shell 을 실행해서 android-ndk-r4 폴더로 이동
    • 빌드할 프로젝트 폴더인 samples로 이동 >> android-ndk-r4/samples/hello-jni
    • ndk-build 를 실행하여 빌드 시작 >> /home/Ryoung/android-nkd-r4/ndk-build -B
    • ㅣNDK Build
  • .so 파일 생성
    • /android_ndk/samples/hello-jni/libs/armeabi 경로에 가면 libhello-jni.so 파일 생성된 것 확인할 수 있다.
    • ㅣ.so파일 생성

Hello Jni 실행

  • 예제 파일이였던 Hello Jni가 들어있는 Sample 파일 가져와서 프로젝트 생성
    • 경로 : android-ndk/samples/hello-jni
    • ㅣndk 빌드해서 생성한 .so 파일 확인


  • Android 에뮬레이터 부팅이 ㅣ끝나면 HelloJni 구동화면 볼 수 있음
  • ㅣ안드로이드 에뮬레이터 구동화면
  • Android NDK에서 제공하는 Sample code는 원시코드의 헤더파일이 이미 만들어져있기 때문 NDK 빌드만 하면 에뮬레이터로 결과를 확인할 수 있다.



HelloJni Sample Code

  • NDK에 포함되어 있는 샘플 코드는 원시코드의 헤더파일이 이미 만들어져있으나, 샘플코드를 기반으로 헤더파일을 만들고 JNI 프로그램을 작성하는 절차를 설명하도록 한다.


안드로이드 프로젝트 생성

  • 제일 먼저 이클립스에서 일반적인 안드로이드 프로젝트를 생성한다.
    • New Project

자바 클래스 작성

  • JNI 규칙에 따라서 공유라이브러리를 로드하고 라이브러리에 포함된 함수를 호출하는 native 메소드를 선언한다.
  • HelloJni.java
package com.example.hellojni;
import android.app.Activity;
import android.widget.TextView;
import android.os.Bundle;
 
public class HelloJni extends Activity {
        /**Called when the activity is first created.*/
        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                TextView tv= new TextView(this);
                tv.setText(stringFromJNI()); // A native 함수호출
                   setContentView(tv);
        }           
 
        // A native function
        public native String stringFromJNI();
 
        // 정의하지 않은 함수 호출시 java.lang.UnsatisfiedLink Errorexception 발생!
        public native String unimplementedStringFromJNI();
 
        // com.example.HelloJni/lib/libhello-jni.so
        static {
                System.loadLibrary("hello-jni");
        }
}
  • Native Method Declaration : public native String stringFromJNI();
    • Native 선언은 자바 가상 머신 내에서 원시 함수를 호출할 수 있는 브릿지를 제공해 준다.
  • 라이브러리 적재 : System.loadLibrary()
    • 원시 코드 구현을 포함하고 있는 라이브러리는 System.loadLibrary()를 호출함으로써 적재된다. 정적 초기화 구문(static initializer ensures) 내에서 이 호출을 함으로써, 클래스당 단 한번만 적재되도록 한다. 클래스에 대해 공유되는 멤버들은 static을 이용하여 선언한다. 클래스 멤버를 선언하는 위치에 static{....} 과 같이 초기화 블럭을 정의하여 사용할 수 있다.
  • main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView
	android:id="@+id/textView"  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/hello"
    />
</LinearLayout>


헤더파일 작성과 프로그램 컴파일

  • 프로그램 컴파일은 command line을 이용하므로 앞에서 설치한 cgywin을 사용한다.
    • 프로젝트가 컴파일 된 bin 디렉토리로 이동한 뒤 javah packagename.classname 를 수행하면 아래 그림과 같이 헤더파일이 생성된다.
    • javah
    • 패키지명이 포함되어 헤더파일이름이 생성되므로 너무 길면 줄여서 사용해도 무방하다.
      • hufs.dislab.hellojni.HelloJni.h --> HelloJni.h


  • 생성된 HelloJni.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class hufs_dislab_hellojni_HelloJni */
 
#ifndef _Included_hufs_dislab_hellojni_HelloJni
#define _Included_hufs_dislab_hellojni_HelloJni
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     hufs_dislab_hellojni_HelloJni
 * Method:    stringFromJNI
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_hufs_dislab_hellojni_HelloJni_stringFromJNI
  (JNIEnv *, jobject);
 
/*
 * Class:     hufs_dislab_hellojni_HelloJni
 * Method:    unimplementedStringFromJNI
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_hufs_dislab_hellojni_HelloJni_unimplementedStringFromJNI
  (JNIEnv *, jobject);
 
#ifdef __cplusplus
}
#endif
#endif

라이브러리 생성을 위한 jni 디렉토리 생성

  • 만들어진 헤더파일(HelloJni.h)을 jni 디렉토리로 이동시킨다.
  • jni 디렉토리는 프로젝트 내에 생성하고 이 디렉토리는 위에서 생성한 헤더파일, C파일, Android.mk 파일을 저장한다.
  • Jni 디렉토리 생성


Android.mk 파일 생성

  • LOCAL_MODULE 에 설정한 값으로 나중에 생성될 공유 라이브러리 이름이 된다. HelloJniTest --> libHelloJniTest.so (일반적으로 라이브러리 이름은 소문자로 해야함...;; )
  • 컴파일할 소스파일이 여러 개일 경우에는 LOCAL_SRC_FILES에 나열해 준다.
  • Android.mk
LOCAL_PATH := $(call my-dir)
 
include $(CLEAR_VARS)
 
LOCAL_MODULE    := HelloJniTest
LOCAL_SRC_FILES := HelloJni.c
 
include $(BUILD_SHARED_LIBRARY)

Native code 작성(C파일 생성)

  • 생성한 헤더파일에 선언된 C 함수를 구현한다.선언된 C함수를 모두 구현하지 않아도 무방하다.
  • Hello-Jni.c
#include <string.h>
#include <jni.h>
 
jstring Java_hufs_dislab_hellojni_HelloJni_stringFromJNI( JNIEnv* env, jobject thiz )
{
        return (*env) -> NewStringUTF(env, "Hello From JNI !");
}


C소스 컴파일 / 공유라이브러리 생성

  • 앞에서 구현한 C 코드를 컴파일하여 라이브러리를 생성한다.
  • C코드 컴파일 & 라이브러리 생성
  • 위의 그림과 같이 Cygwin을 실행하고 해달 프로젝트로 이동한다. 그리고 ndk-build 명령을 이용하여 컴파일을 한다.
  • 컴파일이 끝나면 프로젝트 안에 libs/armeabi 디렉토리가 생성되고 HelloJniTest.so 가 생긴 것을 확인할 수 있다.
  • .so파일 생성 확인
  • 라이브러리 생성 과정까지 마치고 에뮬레이터를 돌려 결과를 확인한다. JNI 프로그램 작성 끝!


참고

Android NDK

  • NAtive code를 안드로이드 애플리케이션에 적용할 수 있게 함
  • NDK는 다음을 제공
    • C와 C++로 라이브러리 작성하는 툴
    • 라이브러리를 Android에 적재할 수 있는 .apsk로 변환하는 방법 제공
    • Native System headers & libraries
    • Documentation, samples & tutorials
  • NDK 활용의 예 : 신호처리, 물리 시뮬레이션, 커스텀 바이트코드/ 명령어 인터프리터 등과 같이 메모리를 너무 많이 할당하지 않으면서도 CPU를 많이 사용하는 작업에 적함
    • 장점 : 빠른실행
    • 단점 : 이식성 없음, JNI 오버헤드 수반, 시스템 라이브러리에 접근불가, 디버깅 어려움
    • 한계
    1. C에서 실행되는 메소드를 단순히 재코딩 하는것 으로는 성능향상에 큰 도움이 되지 않는다.
    2. NDK가 native-only 어플리케이션 개발은 힘들다.(Please note that the NDK does not enable you to develop native-only application)
    3. 안드로이드의 첫 번째 런타임은 Dalvik 가상머신에 있다.
  • 포함 되어 있는 C 헤더들
    • libc ( C 라이브러리 ) 헤더
    • libm ( math 라이브러리 ) 헤더
    • Jni Interface 헤더
  • 호환성을 보장하는 방법( application using a native library produced with the NDK)
    • 해당 매니페스트 파일에 android:minSdkVersion="3" 속성과 함께 <users-library> 엘리먼트를 반드시 선언한다.

출처: http://dislab.hufs.ac.kr/wiki/Android%EC%97%90%EC%84%9C_JNI_%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8_%EC%9E%91%EC%84%B1
저작자 표시
posted by ssuk1010
Android 2010/12/22 20:27
AndroidManifest.xml의 activity 속성중 screenOrientation을 다음과 같이 지정해준다.


//화면을 세로로 유지
 
<activity android:name=".Powermeter"
                  android:label="@string/app_name"
                  android:screenOrientation="portrait">


//화면을 가로로 유지

<activity android:name=".Powermeter"
                  android:label="@string/app_name"
                  android:screenOrientation="landscape">
저작자 표시
posted by ssuk1010
Android 2010/12/16 16:20

px : 픽셀, 한개의 점을 의미한다.
      320*480 해상도라면 가로는 320px, 세로는 480px을 의미한다.
      해상도가 바뀌면 영향을 받아 원하는 위치에 생성되지 않고 인터페이
      스가일그러질수 있다.

dp/dip : 독립 픽셀, 완전하게 해상도에 따라 지원하는 것은 아니지만 
            해상도가 바뀌어도 density를 잘 설정해주면 육안으로 보는것은
            비슷하다.
     px = dp * (density / 160)

dp를 사용할 것을 권장한다~~

저작자 표시

'Android' 카테고리의 다른 글

Android에서 JNI 프로그램 작성  (0) 2010/12/30
Android 화면 고정  (0) 2010/12/22
안드로이드(Android)의 측정 단위  (0) 2010/12/16
Intent의 특징을 나타내는 6가지 구성요소  (0) 2010/12/08
안드로이드 설치 방법  (0) 2010/12/08
Intent list  (0) 2010/12/07
posted by ssuk1010
Android 2010/12/08 15:32

  • 컴포넌트 이름 : 컴포넌트를 실행할 대상 (명시적 Intent)
  • 액션 : 실행할 액션 (암시적 Intent)
  • 데이터 : 실행할 액션의 데이터 Uri등 (암시적 Intent)
  • 카테고리 : 액션만으로 Activity의 용도를 정의하기 어려울때 추가로 카고리를 사용한다.
    Manifest에서 제일 먼저 실행될 Activity를 지정할때 카테고리를 사용
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER"/>
     </intent-filter>
  • 엑스트라  : Activity 사이에 데이터를 전달하는 도구
    putExtra(ID,VALUE); - 값을 전달
    getExtra(ID,VALUE); - 값을 가져옴
  • 플래그 : Intent가 어떻게 제어될지를 정의하기 위해서 추가되는 값
    자주사용되는 flag인 FLAG_ACTIVITY_CLEAR_TOP은 현재 실행하려는 Activity가 스택상으로 해당 Activity보다 위에 있는 Activity는 모두 종료 시킨다.
    A->B->C->D 실행중에 A Activity가 B Activity를 실행시키면 C, D Activity를 종료하고 A->B상태만 남는다.
저작자 표시

'Android' 카테고리의 다른 글

Android 화면 고정  (0) 2010/12/22
안드로이드(Android)의 측정 단위  (0) 2010/12/16
Intent의 특징을 나타내는 6가지 구성요소  (0) 2010/12/08
안드로이드 설치 방법  (0) 2010/12/08
Intent list  (0) 2010/12/07
다른 Activity 호출(암시적 Intent)  (0) 2010/12/07
posted by ssuk1010
Android 2010/12/08 13:52
안드로이드 개발 환경 구성하기 (http://developer.android.com/sdk/1.1_r1/installing.html)
  1. 이클립스 설치 
    1. http://www.eclipse.org/downloads/
    2. Eclipse IDE for Java Developers 버젼을 다운로드 받습니다. 안드로이드에서 WST를 사용하는데 기본으로 WST가 포함되어있으니 새로 설치하신다면 위 버전을 추천합니다.
    3. 적절한 디렉토리에 압축을 풉니다.
  2. Java SDK 설치
    1. http://java.sun.com/javase/downloads/index.jsp
    2. Java SE Development Kit (JDK) 6 를 설치합니다.
  3. 안드로이드 Eclipse 플러그인 설치 (ADT) - Eclipse 3.4버전 기준으로 설명
    1. Eclipe를 실행시킨 후, 메뉴의 Help/Software Update 실행
    2. Available Software 탭으로 이동
    3. Add Site : https://dl-ssl.google.com/android/eclipse/
    4. 새로추가된 사이트 밑에 Developer Tools 라고 되어있는 체크박스를 체크한후 Install
      1. Android Development Tools와 Android Editors가 체크되어있는지 확인합니다.
      2. 약관에 동의한후 Finish를 클릭하면 인스톨 됩니다.
  4. 안드로이드 SDK 설치
    1. http://developer.android.com/sdk/1.1_r1/index.html
    2. SDK 다운로드 후 적당한 위치에 압축 풀기.
  5. 안드로이드 SDK 이클립스  설정
    1. Eclipse의 메뉴 Windows/Preference 실행
    2. 왼쪽 탭에서 Android 선택
    3. Browse를 한후 SDK를 설치한 디렉토리 선택
    4. Apply후 OK
저작자 표시
posted by ssuk1010
Android 2010/12/07 17:40
// 웹페이지 띄우기 
Uri uri = Uri.parse("http://www.google.com"); 
Intent it  = new Intent(Intent.ACTION_VIEW,uri); 
startActivity(it);

 

// 구글맵 띄우기  Uri uri = Uri.parse("geo:38.899533,-77.036476");  Intent it = new Intent(Intent.Action_VIEW,uri);  startActivity(it);

 

// 구글 길찾기 띄우기  Uri uri = Uri.parse("http://maps.google.com/maps?f=d&saddr=출발지주소&daddr=도착지주소&hl=ko");  Intent it = new Intent(Intent.ACTION_VIEW,URI);  startActivity(it);

 

// 전화 걸기  Uri uri = Uri.parse("tel:xxxxxx");  Intent it = new Intent(Intent.ACTION_DIAL, uri);    startActivity(it);  

 

Uri uri = Uri.parse("tel.xxxxxx");  Intent it = new Intent(Intent.ACTION_CALL,uri);  // 퍼미션을 잊지 마세요. <uses-permission id="android.permission.CALL_PHONE" />

 

// SMS/MMS 발송  Intent it = new Intent(Intent.ACTION_VIEW);     it.putExtra("sms_body", "The SMS text");     it.setType("vnd.android-dir/mms-sms");     startActivity(it);  

 

// SMS 발송  Uri uri = Uri.parse("smsto:0800000123");     Intent it = new Intent(Intent.ACTION_SENDTO, uri);     it.putExtra("sms_body", "The SMS text");     startActivity(it);  

 

// MMS 발송  Uri uri = Uri.parse("content://media/external/images/media/23");     Intent it = new Intent(Intent.ACTION_SEND);     it.putExtra("sms_body", "some text");     it.putExtra(Intent.EXTRA_STREAM, uri);     it.setType("image/png");     startActivity(it);

 

// 이메일 발송  Uri uri = Uri.parse("mailto:xxx@abc.com");  Intent it = new Intent(Intent.ACTION_SENDTO, uri);  startActivity(it);

 

Intent it = new Intent(Intent.ACTION_SEND);     it.putExtra(Intent.EXTRA_EMAIL, "me@abc.com");     it.putExtra(Intent.EXTRA_TEXT, "The email body text");     it.setType("text/plain");     startActivity(Intent.createChooser(it, "Choose Email Client"));  

 

Intent it = new Intent(Intent.ACTION_SEND);       String[] tos = {"me@abc.com"};       String[] ccs = {"you@abc.com"};       it.putExtra(Intent.EXTRA_EMAIL, tos);       it.putExtra(Intent.EXTRA_CC, ccs);       it.putExtra(Intent.EXTRA_TEXT, "The email body text");       it.putExtra(Intent.EXTRA_SUBJECT, "The email subject text");       it.setType("message/rfc822");       startActivity(Intent.createChooser(it, "Choose Email Client"));  

 

// extra 추가하기  Intent it = new Intent(Intent.ACTION_SEND);     it.putExtra(Intent.EXTRA_SUBJECT, "The email subject text");     it.putExtra(Intent.EXTRA_STREAM, "file:///sdcard/mysong.mp3");     sendIntent.setType("audio/mp3");     startActivity(Intent.createChooser(it, "Choose Email Client"));

 

// 미디어파일 플레이 하기  Intent it = new Intent(Intent.ACTION_VIEW);  Uri uri = Uri.parse("file:///sdcard/song.mp3");  it.setDataAndType(uri, "audio/mp3");  startActivity(it);

 

Uri uri = Uri.withAppendedPath(    MediaStore.Audio.Media.INTERNAL_CONTENT_URI, "1");     Intent it = new Intent(Intent.ACTION_VIEW, uri);     startActivity(it);  

 

// 설치 어플 제거  Uri uri = Uri.fromParts("package", strPackageName, null);     Intent it = new Intent(Intent.ACTION_DELETE, uri);     startActivity(it);

 

// APK파일을 통해 제거하기  Uri uninstallUri = Uri.fromParts("package", "xxx", null);  returnIt = new Intent(Intent.ACTION_DELETE, uninstallUri);

 

// APK파일 설치  Uri installUri = Uri.fromParts("package", "xxx", null);  returnIt = new Intent(Intent.ACTION_PACKAGE_ADDED, installUri);

 

// 음악 파일 재생  Uri playUri = Uri.parse("file:///sdcard/download/everything.mp3");  returnIt = new Intent(Intent.ACTION_VIEW, playUri);

 

// 첨부파일을 추가하여 메일 보내기  Intent it = new Intent(Intent.ACTION_SEND);    it.putExtra(Intent.EXTRA_SUBJECT, "The email subject text");    it.putExtra(Intent.EXTRA_STREAM, "file:///sdcard/eoe.mp3");    sendIntent.setType("audio/mp3");    startActivity(Intent.createChooser(it, "Choose Email Client"));

 

// 마켓에서 어플리케이션 검색  Uri uri = Uri.parse("market://search?q=pname:pkg_name");    Intent it = new Intent(Intent.ACTION_VIEW, uri);    startActivity(it);    // 패키지명은 어플리케이션의 전체 패키지명을 입력해야 합니다.

 

// 마켓 어플리케이션 상세 화면  Uri uri = Uri.parse("market://details?id=어플리케이션아이디");    Intent it = new Intent(Intent.ACTION_VIEW, uri);    startActivity(it);  // 아이디의 경우 마켓 퍼블리싱사이트의 어플을 선택후에 URL을 확인해보면 알 수 있습니다.

 

// 구글 검색  Intent intent = new Intent();  intent.setAction(Intent.ACTION_WEB_SEARCH);  intent.putExtra(SearchManager.QUERY,"searchString")  startActivity(intent);



참고 : http://theeye.pe.kr/entry/a-tip-of-android-intent-with-simple-examples
저작자 표시
posted by ssuk1010
Android 2010/12/07 17:00
암시적인 Intent를 사용하여 다른 Activity를 호출할 수 있다.
암시적인 Intent란 실행 주체를 서술하지 않고, 목적에 맞게 Activity를 실행하는 것이다.
암시적인 Intent를 사용하기 위해서는 액션데이터가 필요하다.

 -- 전화를 거는 Activity 호출 --
// 전화를 걸기 위한 목적으로 intent생성, 전화번호를 데이터로 넘겨준다.
Intent intent = new Intent(Intent.ACTION_DIAL, Uri.parse("tel:010-1111-2222")); 
startActivity(intent)   // intent 실행

암시적인 intent를 사용하기 위해서는 permission이 필요하다
Manifest.xml에 추가한다.
<uses-permission anroid:name="anroid.permission.CALL_PHONE"/>

 -- Web Activity 호출 --
// Web을 열기위해서 intent생성, web사이트를를 데이터로 넘겨준다.
Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.google.co.kr"));
startActivity(intent)   // intent 실행

 <uses-permission android:name="android.permission.INTERNET"/>


(intent 목록 참조 사이트)
http://developer.android.com/guide/appendix/g-app-intents.html 

저작자 표시
posted by ssuk1010
<PREV NEXT> 1 2 3 4 5 ... 8