Java로 로그를 찍을 땐 Log.i / Log.d ... 등을 이용하여 로그를 출력한다. JNI에서도 이를 지원한다. 에 있는 __android_log_print를 이용하면 되는데, 이걸 그대로 사용하면 너무 길기에 보통 아래와 같이 정의해 놓고 사용한다.#include #define LOG_TAG "tagname" #define LOGV(...) __android_log_print(ANDROID_LOG_VERBOSE, LOG_TAG, __VA_ARGS__) #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG , LOG_TAG, __VA_ARGS__) #define LOGI(...) __android_log_print(ANDROID_LOG_INFO , L..
자바와 C/C++은 내부적으로 배열을 이용하는 구조가 다르다. C/C++은 배열이 메모리 상에서 연속적으로 배치되는데 비해, Java의 경우 반드시 연속적으로 배치돼 있지는 않다. 이런 저런 연유로, Java와 C/C++의 배열은 서로 다르기 때문에, C/C++에서 자바의 배열을 사용하려면 반드시 변환을 해야 한다. C/C++에서 접근 할 수 있는 자바의 배열을 가져오려면 Get[Type]ArrayElement를 사용하며, C/C++에서 자바의 배열에 접근 할 수 있는 배열의 포인터를 반환한다. 중요한 것은, 위의 함수를 이용해 확보한 메모리 영역은, 사용 후 반드시 Release[Type]ArrayElements 함수를 이용해 해제해야 한다는 것이다. // 새로운 int[10] 배열 생성 jintArr..
JNI를 이용하여 C/C++에서 Java 함수를 호출 할 수 있다. 이때는 리플렉션을 이용한다. 개인적으로 Java를 처음 봤을 때 리플렉션 이런거 왜 존재하는 거야..하고 생각했었는데, 요즘 느끼는건 정말.. '강력하다'는 것이다. 웬만하면 변수명/함수명 등의 코드 이름으로 Java 내의 모든 기능을 다 이용 할 수 있으니.. 설계 관점에서 용이해진다. 물론 디버깅이나 가독성은 좀 떨어지는 감이 있지만.. C/C++에서 자바의 메소드를 호출하는 순서는 아래와 같다. FindClass 함수를 이용해서 Java의 클래스를 지정한다. 메소드명과 인자(시그니쳐)를 지정해서 클래스 내의 해당 메소드ID를 찾는다. 1,2에서 구한 클래스와 메소드를 이용하여 호출한다. 이때 반환값이나 정적/일반 메소드에 따라 메소..
JNI를 이용해 C를 호출 할 때, Java 쪽에는 아래의 사항을 지켜야 한다. 호출하는 함수에는 native를 붙인다. loadLibrary()를 이용해서 호출할 라이브러리를 지정한다.(NDK를 이용해서 빌드될 라이브러리) 그리고 C/C++에서는 아래의 사항을 지켜야 한다. 함수명은 Java로 시작하며, 패키지명, 클래스명, 메소드명을 순서대로 적는다. 처음의 2개 인자는 JNIEnv 타입과 jobject 타입으로 해야한다. 이후에 오는 인자들은 Java와 C/C++에서 1:1로 매칭되는 parameter들이다. 예시public class MainActivity extends Activity { public native int add(int a, int b); //'native'가 제일 중요 stati..
JNI에서는 C와 C++을 모두 사용 할 수 있다. 사용법이 약간 다른데, C에서는 env 구조체의 함수 포인터를 이용해 호출하고, C++에서는 env 인스턴스의 멤버 함수를 호출한다. 예를 들어 JNI의 FindClass 함수를 호출하는 예는 각각 아래와 같다. C의 경우 jclass jklass = (*env)->FindClass(env, "java/lang/Integer"); C에서는 함수 포인터를 호출한다. 함수의 첫번째 인자에는 JNIEnv 타입의 변수를 설정하고, 두 번째 부터는 함수에 필요한 인자를 적는다. C++의 경우 jclass jklass = env->Findlass("java/lang/Integer"); C++은 env 인스턴스의 멤버 함수를 호출한다. C처럼 env 구조체를 인자로..
타입 선언 자바에서 건네받은 변수를 C/C++에서 사용할 때, 자바에서 선언한 변수 타입에 따라 C/C++에서 변수를 사용하는 방법이 달라진다. 일반적으로 Java에서 사용하는 원시타입 앞에 j 를 붙이며, 배열의 경우 뒤에 Array를 붙인다. Java JNI(C/C++) JNI(C/C++ 배열) boolean jboolean jbooleanArray byte jbyte jbyteArray char jchar jcharArray short jshort jshortArray int jint jintArray long jlong jlongArray float jfloat jfloatArray double jdouble jdoubleArray object jobject jobjectArray void voi..
Android JNI와 NDK 라는 말을 들어봤을 것이다. 나는 이 둘을 대충 안드로이드에서 JAVA가 아닌 C/C++로 개발 할 때 필요한 방법? 쯤으로 알고 있었다. 하지만 그 둘의 정확한 차이가 무엇인지는 정확히 알지 못했다. 일단 용어 설명부터 하자면 JNI Java Native Interface의 약자. 자바에서 C/C++의 함수를 호출하거나, 반대로 C/C++에서 자바의 클래스와 메소드를 사용할 수 있게 해주는 인터페이스. 참고로 이게 Android를 위해 있는게 아니고 기본 Java에도 있음. 책방에 갔다가 1997년에 나온 JNI책을 보고 깜짝 놀란 기억이... NDK Android SDK 와 같은 개발 키트임. SDK가 Software Development Kit 이듯이, NDK는 Nat..
- Total
- Today
- Yesterday
- 드라이버
- C++
- source
- 리눅스
- Visual C++
- AWS
- gcc
- Quiz
- database
- linux
- it
- Python
- db
- algorithm
- Cloud
- android
- jni강좌
- kering
- jni
- Troubleshooting
- winapi
- 안드로이드
- MFC
- NDK
- 프로그래밍
- java
- driver
- 음악
- API
- C
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |