프로젝트를 진행하는데, @Entity를 만들고 빌드해서 실행하는데아무리 해도 계속해서 org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'AppleRepository': Invocation of init method failed: nested exception is java.lang.illegalArgumentException: Not an managed type: class foo.bar라면서 진행이 안되었다.도대체 뭐가 문제일까 하고 수 없이 수정과 빌드를 반복했는데,,,,,persistence.xml 에 Entity를 등록하지 않은 것이 문제 였다.회사에 Spring Legacy (Spring ..
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..
- Total
- Today
- Yesterday
- driver
- Cloud
- 음악
- it
- database
- gcc
- android
- Troubleshooting
- 리눅스
- AWS
- kering
- Python
- Quiz
- linux
- java
- source
- Visual C++
- winapi
- algorithm
- 안드로이드
- jni강좌
- C
- 드라이버
- MFC
- NDK
- C++
- jni
- API
- 프로그래밍
- db
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |