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..
Synergy 최신 버전은 1.4.18이지만, 이것저것 써본 결과 1.4.10이 그나마 안정화 돼있는 듯 보인다. 문제는 이따금 먹통이 될때가 있는데, 나의 경우는 안드로이드의 ADB를 사용하려는 경우 Synergy와 충돌 나는 경우를 종종 겪었다. (Synergy 서비스가 도는 중, ADB를 사용하면 Synergy가 먹통이 되는 경우가 잦았다.) 이는 cmd에서 netstat -an을 해보면, 5037 포트를 무지막지하게 open한 것으로 확인 가능하다. 여튼.. 이 경우 Synergy 를 다시 실행하려 하면 이런 저런 메세지를 띄우면서 정상 동작을 안하는 경우가 많았다. - Synergy unable to open screen - Failed to init synrgyhk.dll, another pr..
Ubuntu 12.04까지는 lightDM을 사용하여 Synergy 를 시작 프로그램으로 등록하는게 됐었는데.. 14.04 에서는 우째 잘 안되더라. 겨우 등록하려고 하니 'system tray is unvailable quitting' 이라는 에러메뉴가 뜨면서 진행이 안됐음. 그래서 그냥 Startup applications 에 등록을 했더니, 글쎄 마우스 커서가 사라지는 버그가 있더라. 해당 버그는 gsettings를 이용하여 수정 가능하다. 즉, Ubuntu의 Startup Applications에서 1. (클라이언트의 경우) synergyc 등록 2. (서버의 경우) synergys 등록 3. 사라진 마우스를 보이게 하기 위하여 gsettings set org.gnome.settings-daemo..
- Total
- Today
- Yesterday
- it
- Cloud
- jni강좌
- Quiz
- android
- linux
- Visual C++
- 음악
- jni
- AWS
- java
- kering
- Troubleshooting
- API
- source
- algorithm
- C
- 리눅스
- gcc
- C++
- 안드로이드
- 프로그래밍
- Python
- db
- 드라이버
- database
- NDK
- MFC
- driver
- winapi
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |