ndk-build 시 기본으로 화면에 출력하는 정보가 적습니다.
빌드 에러가 발생하는 경우 어떤 명령으로 빌드를 수행하였는지 중요합니다.
참고: https://groups.google.com/forum/#!topic/android-ndk/5OHkW6Hf2JA
$ ndk-build V=1 옵션으로 빌드 명령을 화면에 출력할 수 있습니다.
2015년 7월 10일 금요일
2012년 3월 30일 금요일
[NDK] cygwin + make-standalone-toolchain.sh 실행시 Permission denied
$NDK/build/tools/make-standalone-toolchain.sh 를 실행하여 standalone toolchain 을 원하는 경로에 복사할 수 있다.
cygwin 으로 아래와 같이 실행하였는데 Permission denied 가 발생하며 실패했다.
$ make-standalone-toolchain.sh --platform=android-8 --install-dir=/path/to/target --ndk-dir=/path/to/android-ndk/
Auto-config: --toolchain=arm-linux-androideabi-4.4.3
Copying prebuilt binaries...
Copying sysroot headers and libraries...
Copying libstdc++ headers and libraries...
mkdir: cannot create directory `/tmp/build-6212/standalone/arm-linux-androideabi-4.4.3/arm-linux-androideabi': Permission denied
ERROR: Cannot copy to directory: /tmp/build-6212/standalone/arm-linux-androideabi-4.4.3/arm-linux-androideabi/include/c++/4.4.3
cygwin 을 관리자 모드로 실행하니 문제가 발생하지 않았다.
2012년 3월 14일 수요일
[NDK + cygwin] jni.h no such file or directory
path 에 ndk 경로를 추가해 놓고 ndk-build 도 실행이 되는데 jni.h no such file or directory 식의 컴파일 에러가 발생했다.
이유는 모르겠지만 path 에 추가한 경로를 절대 경로로 변경하고서 문제가 해결 되었다.
예를 들어 ndk 경로를 symbolic link 로 정해 놓고 사용하는 경우 컴파일 에러가 발생했다.
$ ln -s ~/ndk-home /cygdrive/c/android-ndk-r6b/
$ export NDK_HOME=~/ndk-home
$ export PATH=$NDK_HOME:$PATH
$ ndk-build
절대 경로를 사용하니까 에러가 발생하지 않는다.
$ export NDK_HOME=/cygdrive/c/android-ndk-r6b/
$ export PATH=$NDK_HOME:$PATH
$ ndk-build
이유는 모르겠지만 path 에 추가한 경로를 절대 경로로 변경하고서 문제가 해결 되었다.
예를 들어 ndk 경로를 symbolic link 로 정해 놓고 사용하는 경우 컴파일 에러가 발생했다.
$ ln -s ~/ndk-home /cygdrive/c/android-ndk-r6b/
$ export NDK_HOME=~/ndk-home
$ export PATH=$NDK_HOME:$PATH
$ ndk-build
절대 경로를 사용하니까 에러가 발생하지 않는다.
$ export NDK_HOME=/cygdrive/c/android-ndk-r6b/
$ export PATH=$NDK_HOME:$PATH
$ ndk-build
2011년 4월 11일 월요일
[ndk] loop 시 cpu 100% 점유 문제
값이 바뀔 때까지 하는 일 없이 while loop 를 돌리는 코드를 작성하였다.
해당 코드를 실행할 때 cpu 를 100% 점유하였다.
while loop 안에 usleep(0) 을 넣어 주었더니 cpu 점유율이 거의 없다시피했다.
모바일 기기에서 흔히 있는 일이라고 함.
기기에 따라서 최소 sleep 처리 시간이 달라 sleep 값에 0 을 주면 효과가 없는데 이때는 최소 sleep 처리 시간 만큼 값을 주면 된다고 함.
[ndk] pthread 사용
pthread 사용시 -lpthread 할 필요가 없다.
pthread 가 libc 에 포함되어 있다.
pthread.h 를 include 하고 사용하면 된다.
2011년 1월 12일 수요일
[ndk] 팁
Directory 별로 구성
여러 so 파일을 생성하기 위해 ${project}/jni 에 각 so 파일 별로 directory 를 만들었다.
각 directory 아래 Android.mk 파일이 존재하며 각 directory 아래 Android.mk 를 실행하기 위해 ${project}/jni/Android.mk 를 다음과 같이 작성했다.
include $(call all-subdir-makefiles)
하나의 Android.mk 에 여러 so 설정
하나의 so 파일은 include $(CLEAR_VARS) ... include $(BUILD_SHARED_LIBRARY) 로 구성된다.
예)
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := libhello1
LOCAL_SRC_FILES := hello1.cpp
include $(BUILD_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_LDLIBS := -llog
LOCAL_MODULE := libhello2
LOCAL_SRC_FILES := hello2.cpp
include $(BUILD_SHARED_LIBRARY)
!) c 와 cpp 파일의 JNIEnv 사용법이 다르다.
예를 들어 GetArrayLength 함수는 jbyteArray 의 length 를 구하는 함수이다.
data 라는 jbyteArray 의 length 를 구하고자 한다면,
c 에는 아래와 같이 사용하고
(*env)->GetArrayLength(env, data);
cpp 에는 아래와 같이 사용한다.
env->GetArrayLength(data);
제대로 사용하지 않으면 컴파일시 -> operand 에러가 발생할 수 있다.
!) anroid/log.h 를 사용하려면 Android.mk 파일 작성시 LOCAL_LDLIBS 에 -llog 를 추가한다.
#include <android/log.h>
#define TAG "native"
#define logd(...) __android_log_print(ANDROID_LOG_DEBUG, TAG, __VA_ARGS__)
#define logw(...) __android_log_print(ANDROID_LOG_WARN, TAG, __VA_ARGS__)
#define logv(...) __android_log_print(ANDROID_LOG_VERBOSE, TAG, __VA_ARGS__)
#define logi(...) __android_log_print(ANDROID_LOG_INFO, TAG, __VA_ARGS__)
#define loge(...) __android_log_print(ANDROID_LOG_ERROR, TAG, __VA_ARGS__)
여러 so 파일을 생성하기 위해 ${project}/jni 에 각 so 파일 별로 directory 를 만들었다.
각 directory 아래 Android.mk 파일이 존재하며 각 directory 아래 Android.mk 를 실행하기 위해 ${project}/jni/Android.mk 를 다음과 같이 작성했다.
include $(call all-subdir-makefiles)
하나의 Android.mk 에 여러 so 설정
하나의 so 파일은 include $(CLEAR_VARS) ... include $(BUILD_SHARED_LIBRARY) 로 구성된다.
예)
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := libhello1
LOCAL_SRC_FILES := hello1.cpp
include $(BUILD_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_LDLIBS := -llog
LOCAL_MODULE := libhello2
LOCAL_SRC_FILES := hello2.cpp
include $(BUILD_SHARED_LIBRARY)
!) c 와 cpp 파일의 JNIEnv 사용법이 다르다.
예를 들어 GetArrayLength 함수는 jbyteArray 의 length 를 구하는 함수이다.
data 라는 jbyteArray 의 length 를 구하고자 한다면,
c 에는 아래와 같이 사용하고
(*env)->GetArrayLength(env, data);
cpp 에는 아래와 같이 사용한다.
env->GetArrayLength(data);
제대로 사용하지 않으면 컴파일시 -> operand 에러가 발생할 수 있다.
!) anroid/log.h 를 사용하려면 Android.mk 파일 작성시 LOCAL_LDLIBS 에 -llog 를 추가한다.
#include <android/log.h>
#define TAG "native"
#define logd(...) __android_log_print(ANDROID_LOG_DEBUG, TAG, __VA_ARGS__)
#define logw(...) __android_log_print(ANDROID_LOG_WARN, TAG, __VA_ARGS__)
#define logv(...) __android_log_print(ANDROID_LOG_VERBOSE, TAG, __VA_ARGS__)
#define logi(...) __android_log_print(ANDROID_LOG_INFO, TAG, __VA_ARGS__)
#define loge(...) __android_log_print(ANDROID_LOG_ERROR, TAG, __VA_ARGS__)
피드 구독하기:
덧글 (Atom)