2013의 게시물 표시

Hello JNI (6), Android 버전

이미지
From Evernote: Hello JNI, Android 버전 Hello JNI의 안드로이드 버전이다. 액티비티의 onCreate() 메서드에서 네이티브 라이브러리로 문자열을 전달할 것이고, 네이티브 라이브러리에서는 전달받은 문자열을 적당히 처리한 후 다시 자바 쪽으로 돌려줄 것이다. 액티비티는 돌려받은 문자열을 텍스트뷰에 출력한다.
NDK를 추가로 설정하는 외에 다른 설정은 이전의 글들을 참고하기 바란다. 

NDK를 다운로드 받은 후 적당한 곳에 압축을 풀어 놓는다. http://developer.android.com/intl/ko/tools/sdk/ndk/index.html

이클립스의 워크스페이스 설정 창에서 NDK의 경로를 지정해둔다.


안드로이드 프로젝트를 생성하고, 네이티브 메서드를 추가하고, onCreate() 메서드에서는 네이티브 함수로부터 돌려받은 문자열을 텍스트뷰에 출력하도록 작성하였다.
packagekr.pe.elex.example.jni;
importandroid.app.Activity; importandroid.os.Bundle; importandroid.widget.TextView;
publicclassMainActivityextendsActivity { static{             System.loadLibrary("hellojni");       } privatenativeString jni(String str); @Override protectedvoidonCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);             setContentView(R.layout.activity_main);             TextView textview = (TextView) findViewById(R.id.textview);             textview.setText(jni("Hello Android"));       }

Hello JNI (5), 원시 자료형 주고 받기

From Evernote: Hello JNI, 원시 자료형 주고 받기 자바의 원시 자료형을 매개변수로 주고 받을 때에는, 문자열을 가져오고 생성하는 것과는 달리, JNI 의 변환 함수를 거칠 필요가 없다. 자료형의 크기 등에만 주의하면 된다.
packagekr.pe.elex.example.jni;
/**  * JNI 테스트  *  *@version5  *@authorElex  */ publicclassHelloJni {
static{             System.loadLibrary("libhellojni");       }
privatenativeintsum(inta,intb);
publicstaticvoidmain(String[] args) { inta = 2, b = 3;             HelloJni test =newHelloJni();             System.out.println(a +" + "+ b +" = "+ test.sum(a, b));       }

Hello JNI (4), C++ 버전

이미지
From Evernote: Hello JNI, C++ 버전 새로운 C++ 프로젝트를 만들고 C 프로젝트를 설정한 것과 마찬가지로 C++ 프로젝트를 설정해야 한다. 프로젝트 설정 창에서 C++ 컴파일러의 Include 항목에 JDK의 include 폴더 위치를 지정한다. 그외에 다른 설정 사항들은 C 프로젝트와 동일하다.




자바 소스 파일에는 네이티브 함수 하나만을 정의해 두었고 다음과 같다. 자바에서 매개변수로 문자열을 전달해 줄 것이고, C++에서는 이 문자열을 받아서 적당한 처리를 한 후에, 다시 자바 쪽으로 돌려줄 것이다. 자바에서는 돌려 받은 문자열을 화면에 출력한다.
packagekr.pe.elex.example.jni;
/**  * JNI 테스트  *  *@version4  *@authorElex  */ publicclassHelloJni {
static{             System.loadLibrary("libhellojnicpp");       }
/**        * 네이티브 라이브러리로 문자열을 넘겨주면,        * C++에서는 문자열을 처리한 후,        * 다시 자바쪽으로 문자열을 넘겨준다.        *        *@paramstr        *@return        */ privatenativeString jni(String str);
publicstaticvoidmain(String[] args) {
            HelloJni test =newHelloJni();

JNI 자료형

From Evernote: JNI 자료형
JNI 원시 자료형 자바의 원시 자료형은 각각의 자료형의 크기에 맞게 C언어의 자료형으로 맵핑되는데, 자바의 자료형 이름 앞에 j가 붙는다. jni.h, jni_md.h 파일에 정의되어 있다.
예를 들어, 자바의 int형은 JNI에서 jint 형으로 맵핑되는데, 이는 부호있는 32비트 정수형으로 정의되어 있다. 자바의 boolean, byte, char, short, int, long, float, double형은 JNI에서 각각 jboolean, jbyte, jchar, jshort, jint, jlong, jfloat, jdouble형이다.
#. 원시자료형은 '값'이 복사되어 매개변수가 전달되고, 그 외의 객체들은 '참조'가 전달된다.
#. 덤으로, jni.h에는 JNI_FALSE, JNI_TRUE도 정의되어 있는데 그 값은 각각 0, 1이다. 또한, 크기 등을 나타내기 위한 jsize형은 jint형과 같다.
자바JNI크기booleanjbooleanunsigned 1 bytebytejbytesigned 1 bytecharjcharunsigned 2 byteshortjshortsigned 2 byteintjintsigned 4 bytelongjlongsigned 8 bytefloatjfloat4 bytedoublejdouble8 byte



JNI 참조 자료형 JNI에는 몇가지 참조 자료형이 정의되어 있는데, C언어에서는 모두 jobject형으로 정의되어 있고, C++에서는 상속 구조로 표현되어 있다.
jobject (java.lang.Object)jclass (java.lang.Class)jstring (java.lang.String)jarrayjobjectArray (Object[])jbooleanArray (boolean[])jbyteArray (byte[])jcharArray (char[])jshortArray (short[])jintArray (int[])jlongArray (lon…

JNI 문자열 처리 함수

From Evernote: JNI 문자열 처리 함수 Clipped from: http://docs.oracle.com/javase/7/docs/technotes/guides/jni/spec/functions.html#string_operations 문자열 생성jstring NewString(JNIEnv *env, const jchar *unicodeChars, jsize len);
Constructs a new java.lang.String object from an array of Unicode characters. PARAMETERS: env: the JNI interface pointer.unicodeChars: pointer to a Unicode string.len: length of the Unicode string.
RETURNS: Returns a Java string object, or NULL if the string cannot be constructed. THROWS:OutOfMemoryError: if the system runs out of memory.

문자열의 길이
jsize GetStringLength(JNIEnv *env, jstring string); Returns the length (the count of Unicode characters) of a Java string.


PARAMETERS: env: the JNI interface pointer.string: a Java string object.
RETURNS:Returns the length of the Java string.


문자열 가져오기
const jchar * GetStringChars(JNIEnv *env, jstring string, jboolean *isCopy); Returns a pointer to the array of Unicode characters of the string. This pointer is valid until ReleaseStringchars(…