본문 바로가기

6. With IT/6.2 NDK

JNI로 call by reference형태 구해보기 보통 call by reference는 C/C++에서 많이 쓰이는 방법인데, JNI를 통해서도 구현 가능한지 의문이들어 테스트해보았다.(^0^) Java단에서 C단으로 call by reference를 하려면 주소값을 넘겨주어야 하는데, 여기에서는 하나의 객체를 만들어서 접근하는 방법으로 진행해 보았다. class Myclass { int a = 1;int b = 2;}...protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(com.example.jni.R.layout.activity_main);...Myclass myobject = new Myclass(); // 이런식으로.. 더보기
NDK-다중 타겟 패턴. 멈춤 문제 ndk작업을 하다가 이번에 새로 컴퓨터를 옮겨서 다시 안드로이드 사이트에 들어가 ndk를 최신버전으로 받고 컴파일을 해보니, "obj/local/armeabi/objs/SVMCore/interpreter.o.d:1: *** 다중 타겟 패턴. 멈춤." 이런 식으로 뜬다. ㅡㅡ;; 다른 게 아~~~~~~~~~~무것도 안뜨고, 저렇게만 뜬다;;;;;;(젠장...) 결론은 이거였다. 이전에 ndk 7버전에서 생성된 obj폴더 안에 있던 (.so .a)파일들이 이번에 새로 바귄 ndk8버전으로 빌드하여, 이전에 있던 파일들과 현재 컴파일한 파일들이 꼬인 것으로 예상되었다.... 심지어 "ndk-build clean"도 되지 않는 상황이 발생했으니 매우 난감할 따름이었다.;;;;; 해결책은 직정 obj폴더로 들어가.. 더보기
extern사용 예(리눅스환경) 리눅스의 컴파일러에는 gcc와 g++ 이라는 바이너리가 있다.이들은 모두 /usr/bin 디렉토리에 위치하고 있다.이들의 차이점은 여러가지가 있지만, 먼저 확장자를 가지고 소스의 종류를 판단한다는 것이다.같은 소스라도 확장자를 *.c로 할때는 gcc를 *.cpp로 할 때는 g++를 사용해야 한다.아래와 같은 extern 함수를 테스트해보자.gcc로 모두 빌드하기 위해서 확장자를 모두 *.c로 만들었다.timeprint.c-----------------#include void log(int level, char *message) { time_t tmp_time = time(NULL); char *tmp_ctime = ctime(&tmp_time);tmp_ctime[strlen(tmp_ctime) - 1] .. 더보기
안드로이드 File Explorere에서 sdcard안에 디렉토리가 만들어지지 않을때... 증상mkdir SVMmkdir failed for SVM, Read-lnly file system 해결mount -o remount ,rw /mkdir SVM 더보기
android-ndk-profile NDK에서 코딩된 소스의 속도 측정을 위하여, profile하는 방법이 되겠다. 다른 삽질하는 사람들을 위하여......ㅋㅋㅋ(나를포함 ㅡ.ㅡ) 1. http://code.google.com/p/android-ndk-profiler/이 곳에서 android-ndk-profile.zip 을 받는다.(현재 버전 : android-ndk-propfiler-3.1.zip) 2. 해당 작업중인 프로젝트에 압출을푼다.(.../jni)cd $HOME/path/to/my-project unzip android-ndk-profiler.zip 3. 디렉토리안에 자신에 해당하는 타킷 디바이스용 static library(.a)를 복사하여 ndk-build될 디렉토리안에 넣는다.("그 파일만" 복사해서 가져옴!!!)ex) ... 더보기
NDK_컴파일과정과 링크 a.h, b.h, c.h a.cppb.cppc.cpp LOCAL_SRC_FILES := \ a.cpp \ b.cpp \ c.cpp \ # 각각 정적 라이브러리로 만들어줘야, 공유 라이브러리생성시, 가져다 쓸 수 있다.include $(BUILD_STATIC_LIBRARY)=> 이것들을 컴파일 하면 AlphabetLib.a (static library) 가 생긴다============================================================================ ============================================================================ one.h, two.h, three.h one.cpptwo.cppthree.. 더보기
(.data+0x0) multiple definition of 변수 에러 위와 같이 나왔다면, 1. 중복되서 선언된 부분이 있거나, 2. 헤더 파일에서 어떤 값을 초기화 해주어서 나타나는 결과가 될 수 있다. 해결책은 c파일에 변수를 선언하고, 초기화 해주고 헤더파일에 extern으로 그 변수를 선언하면 오류가 뜨지 않는다. 3. 헤더 파일에 초기화된 변수가 있는데 그 헤더 파일을 여러번 include할 때 이런 문제가 발생한다. 더보기
정적라이브러리 동적라이브러리 더보기
c에서 java호출(Native to Java) 한번 더 포스팅한다. 이 빌어먹을 것 때문에 얼마나 많은 시간을 소비하였는가....ㅡㅡ;;; #include ... JavaVM *g_VM; JNIEnv *_env; jclass jNativesCls; ... JNIEXPORT void JNICALL Java_net_fhtagn_moob_MoobRenderer_nativeResize (JNIEnv *env, jobject thiz, jint w, jint h) { ... // 1. JNI사용을 위한, VM얻기 env->GetJavaVM(&g_VM); if( _env == NULL ) { _env = env; } if( g_VM == NULL ) { _env->GetJavaVM(&g_VM ); } // 2. Java에서 사용할 method가 선언되어있는 클.. 더보기
NDK-static library빌드 관련... 출처 : http://mobilism.tistory.com/56 NDK를 사용하는 예제들을 보면 대부분 d.. 더보기
Native to Android Native단에서 Java쪽의 Method를 호출하는 방법이 되겠다.!!!(이 내용은 Android code) (NDK쪽에 공부하시는 분들중, 나같이 개고생하시는 분들이 없기를 바라며....,,ㅡㅡ'') public class Native { static { System.loadLibrary(함수명); // c파일명 } // java --> C public native void execute(); private static EventListener listener; public static interface EventListener { // java function 등록 int printConsole(String str); } /******************************************.. 더보기
android-ndk-r7오류 Z:\Coding\cygwin\home\Scott\android-ndk-r7\prebuilt\windows\bin\awk.exe: can't open file /home/Scott/android-ndk-r7/build/awk/check-awk.awk source line number 1 source file /home/Scott/android-ndk-r7/build/awk/check-awk.awk context is >>> 더보기
cygwin삭제
이클립스_NDK자동 컴파일 (주의 : android-ndk-r7이 시스템 path에 등록되어있어야됨) 1. 해당 프로젝트의 Property => 'New'클릭 2. Main탭 설정 (@주의 : --login -c "ndk-build -C '${build_project}' -B" => Bold표시부분이 NDK옵션 주는 위치) 3. Refresh설정(말그대로 Refresh할 디렉토리 지정) 4. Environment 넘어가 5. Build Options ( 말그대로 빌드될 디렉토리 설정, ㄱㅣ타 옵션은 입맞대로...) 끝 더보기
Android.mk Android.mk file syntax specification Introduction: ------------- This document describes the syntax of Android.mk build file written to describe your C and C++ source files to the Android NDK. To understand what follows, it is assumed that you have read the docs/OVERVIEW.html file that explains their role and usage. Overview: --------- An Android.mk file is written to describe your sources to th.. 더보기
static chain // dynamic chain scope이란, 변수의 접근이 가능한 범위를 뜻합니다. 이 scope을 결정하는 방식에는 두가지 방식이 있는데, 첫째는 static scoping이고 둘째는 dynamic scoping입니다. static scoping에 대해서 설명을 하자면, static scoping은 run time에서 프로그램의 flow에 관계 없이 compile time에 변수의 scope이 결정되는 방식입니다. 대표적으로 C를 생각하시면 되겠네요. C에서는 변수의 scope이 변수의 선언 위치에 따라서 compile time에 결정이 되지요. 이 때, subroutine을 subroutine 안에서 선언할 수 있는 Pascal 등의 언어는 자신 바깥에 있는 어느 함수가 자신을 호출했는지 확정할 수 없는 문제가 발생하는데, 이에.. 더보기
NDK + eclipse + cygwin 플러그인하는방법 ndk 를 빌드 할 때는 cygwin 창을 옆에 띄어 두고 하는 것이 가장 빠르고 편리하다. 자주.cpp 파일을 변경하게 된다고 하면 그렇지만, 정말 가끔 .cpp 를 빌드 한다고 하면 구지 cygwin 창을 띄우지 않고 eclipse에서 자동으로 빌드를 하게 할 수 있다. 이렇게 되면 오류 message도 깔끔하게 볼 수 있고 좋게 되지만 단점이라고 하면 할 때 마다 cygwin 을 부팅 시키므로 시간이 좀 오래 걸린다. 각자의 용도에 따라 사용 하면 될 것 같다. 일단 이전 포스트에서 성공한 libs와 obj폴더를 삭제 한다. 프로젝트 설정에서 Builders 의 New를 선택하고 tool type에서 Program을 선택 한다. NDK란 이름으로 살짝 바꿔주고 Location에 자신의 cygwin .. 더보기
JNI & NDK 설치 1.Download NDK „ go to Android Development site and download „ NDK & SDK „ http://developer.android.com/sdk/ndk/index.html „ go to Cygwin site and download „ http://cygwin.com/install.html 2. Install(Cygwin) „ 1. Choose A Download Source „ Install from Internet „ 2. Select Root Install Directory „ to use as a root(Z:Coding\’cygwin’) „ 3. Select Local Package Directory „ to store the installation.. 더보기
JAVA JNI & Android NDK - 설치 및 사용 JAVA JNI 1. Path 설정 변수 이름 : JAVA_HOME 변수 값 : C:\Program Files\Java\jdk버전명 추가 확인 2. CLASS_PATH 설정 변수 이름 : CLASSPATH 변수 값 : .;C:\Program Files (x86)\Java\jdk1.6.0_25\lib\tools.jar; (주의: 최초 CLASSPATH변수를 생성해서 변수 값을 넣을 경우, 맨 앞에 쩜콜론(.;)을 추가!!) 확인 나머지과정을 보통을 책들에 다 들어가 있음 -끝- Android NDK => http://blog.naver.com/dizmahs/110087452000 더보기