검색결과 리스트
글
안드로이드 Native(NDK) 소스를 간단하게 보는 방법
안드로이드의 카메라 기능에 대해 알아보고 싶어서 직접 안드로이드 라이브러리 내부에 있는 클래스를 열어 이리저리 해집고 다니다가 다음과 같은 코드를 목격하게 되었습니다.
JNI를 접해본 경험이 없으신 분들께서는 아마 난생 처음 보는 녀석인 native를 보고 당황하실 분들이 있으시리라 생각합니다.
JNI란 Java Native Interface의 약자로, 아주 간단하게 설명드리자면 안드로이드를 C/C++로 구현할 수 있는 기능입니다! Java 소스코드는 안드로이드 내에 있는 Dalvic머신(Lolipop 이후부터는 ART)에서 구동됩니다만 안드로이드 폰 내의 센서나 커널 등을 다루게 될 때는 JNI를 통해 C/C++로 접근하여야 합니다.
위의 경우도 Camera 센서를 구동하기 위해 NDK를 통해 해당 함수가 구현된 것을 native로 나타내고 있다고 볼 수 있습니다. 그렇다면 이 Native 코드는 직접 볼 수 있는걸까요?
가장 확실한 방법은 안드로이드의 OS 커널을 직접 다운받아 해당 소스코드를 직접 찾아보는 방법입니다. 커널은 위 사이트에서 다운로드 하실 수 있습니다.
http://source.android.com/source/downloading.html
하지만 커널을 직접 구경할 일이 없는 분들께 이 방법은 번거롭기만 합니다. 게다가 자신이 원하는 소스코드를 바로 찾는 것도 상당히 불편합니다. 그렇다면 좀 더 편하게 안드로이드 native 소스코드를 볼 수 잇는 방법은 없는걸까요?
위 사이트는 안드로이드 OS에 있는 Android와 Kernel의 소스코드를 인터넷으로 볼 수 있도록 되어 있습니다. 검색 기능을 제공하고 있어 자신이 찾고자 하는 소스코드를 더 쉽게 찾을 수 있습니다.
위 사이트에 접속하신 후 자신이 보고자 하는 안드로이드 버전을 클릭합니다. 여기서는 현 시점에서 최신버전인 Lolipop을 선택하였습니다.
검색하기 원하는 버전을 선택하신 후 위 사진에서 붉은 네모칸으로 표시한 'select all'을 선택하신 후 왼쪽 'Full Search' 부분에 자신이 찾고자 하는 native 함수명을 입력합니다.
다음과 같이 해당 함수명을 가지고 있는 소스코드들이 검색에 잡히는 것을 확인하실 수 있습니다. 해당 함수가 존재하는 소스코드는 다음과 같이 찾으실 수 있습니다.
Java 소스코드에 있는 native 함수가 있는 클래스의 패지명이 소스코드의 명칭이 될 경우가 대부분입니다. 예를들어 Camera.java가 위치한 패키지는 android.hardware.Camera입니다. 즉, jni 내부의 소스코드의 명칭은 android_hardware_camera.cpp가 해당 코드라고 할 수 있습니다.
Native 소스코드 내의 함수명은 '클래스의 패키지경로_함수명()'으로 구성되어 있습니다. 즉 android.hardware.Camera 클래스 내에 있는 native 함수인 native_setup 함수는 해당 소스코드 내에서는
'android_hardware_Camera_native_setup(JNIEnv *env, jobject thiz, ...)'
와 같은 형식으로 구성되어 있음을 확인하실 수 있습니다.
'안드로이드 > 프레임워크' 카테고리의 다른 글
make: *** [out/target/common/obj/PACKAGING/checkapi-last-timestamp] error 38 (0) | 2015.01.18 |
---|---|
안드로이드 프레임워크 프로그래밍(3) [NEXUS5에 소스 빌드하기] (36) | 2015.01.17 |
make: *** [out/target/product/generic/obj/SHARED_LIBRARIES/libwebviewchromium_intermediates/LINKED/libwebviewchromium.so] error 1 (0) | 2015.01.07 |
안드로이드 프레임워크 프로그래밍(2) [안드로이드 커널 다운로드 및 컴파일] (0) | 2015.01.04 |
안드로이드 프레임워크 프로그래밍(1) [입문 및 동작환경 구축] (0) | 2015.01.03 |
설정
트랙백
댓글
글
[NDK] openCV jni 소스 헤더파일이 include 되지 않을 때 해결방법
안드로이드로 openCV를 해보기 위해 NDK를 설치한 후 직접 소스를 수정해보기 위해 소스파일을 연 순간 다음과 같은 장면이 펼쳐졌습니다.
분명 직접 빌드까지 하였던 프로젝트임에도 이렇게 헤더파일이 잡히지 않아 당황하였습니다. 혹시 프로젝트를 빌드에 성공하지 못하셨던 분이라면 아래의 블로그를 참조해 주시길 바랍니다.
http://adppark.tistory.com/303
그럼 프로젝트의 헤더파일이 연결될 수 있도록 해보겠습니다.
1. 자신이 원하는 jni 프로젝트 폴더를 오른쪽 클릭 -> Properties -> C/C++ General -> Paths and Symbols를 선택합니다.
2. 다음과 같은 화면이 나오면 Includes 탭 내의 Languages 내에서 C/C++ 둘중 Include directories가 있는 경우 모두 추가해줍니다.
오른쪽의 Add를 선택합니다.
3. File System...를 선택하신 후
4. "자신의 안드로이드 openCV 버전/sdk/native/jni/include"를 선택하신 후 확인 버튼을 누른 후
5. OK버튼을 눌러 Include directories에 추가합니다.
6. 추가한 Include 디렉토리를 상단 두번째에 위치시킵니다. 오른쪽의 Move Up를 클릭하여 이동이 가능합니다.
8. jni 폴더 내에 있는 Android.mk 파일을 연 후 include 부분에 자신의 OpenCV의 절대 경로로 수정합니다.
9. 시작버튼을 눌러 '고급 시스템 설정'을 검색하여 나오는 항목을 클릭합니다.
10. 다음과 같이 시스템 설정 메뉴가 나오는 것을 보실 수 있습니다. 아래 환경변수(N)을 클릭합니다.
11. 새로 만들기(W)를 선택하신 후
12. 자신의 Android NDK의 환경변수를 설정합니다.
변수 이름은 'NDKROOT'로 설정하시고
변수값에는 자신의 NDK가 있는 위치를 입력하신 후 확인버튼을 누릅니다.
위와 같은 과정을 거치시면 다음과 같이 헤더파일이 정상적으로 동작하는 것을 확인하실 수 있습니다.
'안드로이드 > 애플리케이션 제작' 카테고리의 다른 글
설정
트랙백
댓글
글
WF2411 공유기를 통한 외부 기기와 소켓 통신 프로그래밍
스마트폰 시대가 열리면서 요즘은 집마다 공유기를 두는 경우가 많습니다. 그 덕에 공유기를 통해 안드로이드폰으로 통신하는 기능을 가진 기기들도 속속 등장하는 것을 볼 수 있지요.
소켓 프로그래밍에 처음으로 입문한 분들의 경우 IP의 개념이 제대로 정립되지 않았을 경우 열심히 코드를 입력하였는데도 소켓 프로그래밍이 제대로 동작하지 않는 경험으로 멘붕을 경험하신 분들이 꽤 되실 거라 생각합니다.
같은 공유기에 접속한 기기 끼리는 소켓 통신이 원활이 되는데 왜 공유기로 들어오는 신호는 잡히지 않을까요? 그 이유는 공유기가 접속한 기기에 제공하는 IP주소에서 원인을 찾을 수 있습니다.
IP주소는 집주소와 같아 해당 IP주소를 입력하면 이론상 그 IP를 가진 컴퓨터에 접속하실 수 있습니다. 실제로 티스토리를 도메인이 아닌 아이피 주소를 입력하면 티스토리로 접속할 수 있는 것을 알 수 있습니다.
이미지 출저 : http://www.madtomatoe.com/what-are-private-ip-addresses/
일반적으로 집에서 여러 대의 컴퓨터를 사용하게 될 때 각 컴퓨터마다 인터넷을 연결하기 위해서는 각 컴퓨터 대수 만큼의 회선이 필요합니다. 만약 각 컴퓨터마다 각각 다른 통신사의 회선을 연결하게 되면 통신요금이 상당히 많이 나올겁니다.
이렇게 집안에 여러 대의 컴퓨터를 하나의 회선으로 사용할 수 있게 해주는 역할을 하는 것이 바로 공유기 입니다. 외부로부터 하나의 IP를 할당받아 인터넷에 접속할 수 있는 공유기에 각 컴퓨터의 회선을 한 공유기에 연결하면 연결된 PC들이 동시에 인터넷을 할 수 있습니다. 이 때 각 컴퓨터마다 인터넷에 접속하기 위해서는 각자 다른 IP주소를 할당받아야 합니다.
공유기가 외부로부터 연결된 회선의 IP는 1개 뿐인데 이 여러대에 연결된 컴퓨터에는 주소를 어떻게 배포할까요? 이는 각 기기별로 공유기 자체에서 제공하는 주소를 나누어 주는 것으로 해결할 수 있습니다. 이 때 공유기가 각 컴퓨터에 할당하는 IP를 사설 IP라고 합니다.
이 상황에서 공유기에 연결된 컴퓨터 끼리는 공유기가 할당한 IP주소를 통해 서로 통신을 할 수 있는 망이 구축된 것을 확인할 수 있습니다. 하지만 이들의 IP주소를 외부망에 있는 컴퓨터에 연결을 하려면 어떻게 해야 할까요?
1. 실제 컴퓨터가 할당받은 사설 IP에 접속한다.
사설 IP는 192.168.x.x 대열에서 사용되도록 하고 있습니다. 즉, 해당 주소를 가진 PC는 공유기에 연결되어 있는 모든 PC들을 대상으로 한다고 볼 수 있죠. 이는 해당 컴퓨터의 유일한 IP주소가 아니기 때문에 접속이 불가능합니다.
2. 공유기가 할당받은 IP에 접속한다.
분명 공유기는 외부로부터 자신만의 IP를 할당받았습니다. 실제로 외부망에서 공유기의 WAN포트에 걸린 IP주소를 입력하면 공유기에 접속이 가능합니다. 하지만 여기서 문제가 발생합니다. 우리가 목표로 하는 것은 공유기에 연결된 PC에 접속을 하는 것이지만 공유기 위치에서 해당 컴퓨터의 IP주소를 알아야 접속이 가능합니다. 하지만 처음에 접속할 때 우리는 오직 공유기에 도달하기 위핸 1개의 IP밖에 사용할 수 없습니다.
그렇다면 위 2가지 방법 이외의 접속방법은 없는걸까요?
이 질문의 답은 각 공유기가 제공하는 포트포워딩(Port forwarding)을 사용하는 방법으로 해결할 수 있습니다.
이미지 출저 : http://documentation.commvault.com/hds/v10/article?p=features/firewall/port_forward_gateway.htm
위 그림에서 중간에 위치한 기기를 공유기라 하였을 때 오른쪽의 컴퓨터는 외부의 컴퓨터로 공유기의 IP를 통해 접속을 시도하는 모습을 나타내고 있습니다. 왼쪽의 2대의 컴퓨터는 각각 공유기에 연결되어 있으며 440포트가 개방되어 있는 상황을 나타내고 있습니다.
만약 공유기가 포트포워딩으로 외부에서 공유기의 특정 포트를 연결하게 되면 공유기는 해당 포트로 접속시 설정된 공유기에 연결된 컴퓨터에 연결할 수 있도록 도와줍니다.
예를들어 외부의 컴퓨터가 공유기의 IP주소와 포트번호 443번을 입력하였을 경우 공유기는 443번 포트 접속시 설정되어있는 사설IP와 포트번호를 통해 내부망의 컴퓨터에 접속을 시도하게 됩니다. 이와 같은 방법으로 공유기 외부의 컴퓨터가 공유기 내부에 연결된 PC와 소켓통신을 할 수 있는 것을 알 수 있습니다.
여기까지 포트포워딩에 대해 간단하게 설명드렸습니다. 포드 포워딩에 대해 좀 더 자세히 알고 싶으신 분은 아래의 블로그를 참조하시길 바랍니다.
http://luckyyowu.tistory.com/102
그렇다면 이번에는 외부 컴퓨터가 공유기 내부망에 연결된 컴퓨터와 소켓 프로그래밍을 할 수 있는 환경을 설정해 보도록 하겠습니다.
※본 포스팅은 Windows7 기반의 컴퓨터와 Netis사의 WF2411 공유기를 기준으로 작성되었습니다.
1. 먼저 CMD를 실행하여 'ipconfig'를 입력하면 아래와 같은 결과를 알 수 있습니다. 이 때 IPv4가 해당 컴퓨터가 공유기로부터 할당받은 IP 주소입니다. 이를 기억하도록 합니다.
2.자신의 공유기의 관리자 모드에 접속합니다.
Netis사의 공유기의 초기 설정은 http://192.168.1.1 로 설정되어 있습니다.
3. '방화벽/포트 포워딩 메뉴'로 들어가신 후 '가상 서버' 메뉴를 선택하시면 위와 같은 화면을 보실 수 있습니다.
'규칙 이름'은 자신이 알 수 있는 이름으로 정해줍니다.
'내부 IP 주소(서버 PC)'는 외부 접속을 받고자 하는 공유기 내부망 PC의 사설IP주소를 입력하는 부분입니다. 위 CMD를 통해 확인한 IP주소를 입력하면 되겠습니다.
소켓 프로그래밍 용도로 접속을 하는 것이므로 '프로토콜'은 TCP로 설정합니다.
'포트번호(외부)'는 외부에서 공유기 접속시에 입력하는 Port 번호로 외부 컴퓨터가 공유기에 접속할 때의 포트번호를 입력합니다.
'포트번호(내부)'는 위에서 설정된 포트번호로 접속한 외부 접속을 공유기에 연결된 PC에 전송시 쓰이는 포트번호입니다. 공유기에 연결된 PC가 정해진 포트로 접속해야할 경우 해당 포트번호를 입력합니다.
위의 설정을 모두 완료하시면 외부 접속으로 공유기 내에 있는 기기가 소켓 통신을 하는 것을 확인하실 수 있습니다.
※Windows7 기반 사용자의 경우 위의 설정까지 진행되었음에도 소켓통신이 이루어지지 않는 경우가 있습니다. 이는 해당 Windows7에 설정된 방화벽으 접속을 막는 경우 발생합니다. 이를 해결하기 위해서는 방화벽 설정을 통해 특정 포트를 개방하면 해결할 수 있습니다. 자세한 사항은 다음 포스팅을 참고 하시기 바랍니다.
'공대생의 팁' 카테고리의 다른 글
[VMware] NX / XD is required. The processor must support and it must be enabled in the BIOS. (0) | 2015.02.21 |
---|---|
Windows XP에서 DOS 파일 실행시 EMS 문제 해결방법 (0) | 2015.01.26 |
윈도7 기반 서버 컴퓨터와 소켓 프로그래밍이 안될 때 (0) | 2014.11.01 |
데이터베이스 ER 다이어그램 작성 프로그램 - yED (0) | 2014.10.07 |
fedora 20 에서 virtualbox 설치가 안될 때 (1) | 2014.10.05 |