티스토리 뷰
JNI 에서 파라메터로 받은 변수들은 내용을 수정하여도 안드로이드에서 넘겨주는 변수에는 영향을 주지 않는다.
리턴으로 넘기면 가능하긴 하나 여러개의 정보들을 돌려주어야 할 경우에는 파라메터를 클래스로 받아 내용을 Set 하면 된다.
필요파일들...
MainActivity.java -> JNI 라이브러리를 사용할 파일
CResponse.java -> JNI 라이브러리에 인자로 넘길 클래스 정의 파일
TestLib.java -> JNI 라이브러리를 안드로이드에서 사용하기 위한 파일 (swig에서 생성)
TestLibJNI.java -> JNI 네이티브 함수가 정의된 파일 (swig에서 생성)
java 쪽에 파라메터로 넘길 클래스를 만든다. (Set / Get 만들어놓음)
CResponse .java
package com.xxx.example.;
public class CResponse extends java.lang.Object
{
private String strResponse;
public void SetStringValue(String str)
{
strResponse = str;
}
public String GetStringValue()
{
return strResponse;
}
}
JNI로 값을 넘길때의 예제...
MainActivity.java
// 내용 생략...
CResponse Response = new CResponse();
nRet = test1.GetResponse(Response);
String strResponse = Response.GetStringValue();
// 내용 생략...
TestLib.java
package com.xxx.example.;
public class TestLib {
static {
System.loadLibrary("TestLib");
}
public static int GetResponse(Object strDest) {
return TestLibJNI.GetResponse(strDest);
}
}
TestLibJNI.java
package com.xxx.example.;
public class TestLibJNI {
public final static native int GetResponse(Object jarg1);
}
네이티브 코드쪽은 이렇게 처리한다...(C++ 기준이며 C는 약간 다르다)
jclass jClass = jenv->FindClass("com/xxx/example/CResponse");
-> 안드로이드 쪽에 만들어놓은 응답 클래스를 찾는다.
jmethodID jObjectID = jenv->GetMethodID (jClass, "SetStringValue", "(Ljava/lang/String;)V");
-> 응답 클래스의 SetStringValue라는 메소드를 찾는다.
jenv->CallVoidMethod (jarg1, jObjectID, jresponse);
-> 인자로 받은 응답 클래스의 SetStringValue라는 메소드를 호출한다.
※ 안드로이드 최신 버전에서 리턴 타입이 void 인 함수를 CallObjectMethod로 호출하면 오류가 발생 되어 CallVoidMethod로 변경
SWIGEXPORT jint JNICALL Java_com_xxx_example_TestLibJNI_GetResponse(JNIEnv *jenv, jclass jcls, jobject jarg1) {
jint jresult = 0 ;
char arg1[100000] = {0,};
int result;
(void)jenv;
(void)jcls;
jclass jClass = jenv->FindClass("com/xxx/example/CResponse");
if (jClass == NULL)
{
// Unable to find the jClass!
return NULL;
}
jmethodID jObjectID = jenv->GetMethodID (jClass, "SetStringValue", "(Ljava/lang/String;)V");
if (jObjectID == NULL)
{
// Unable to find the method setValues!
return NULL;
}
result = (int)GetResponse(arg1);
jresult = (jint)result;
if (arg1)
{
jstring jresponse = jenv->NewStringUTF(arg1);
jenv->CallVoidMethod (jarg1, jObjectID, jresponse);
}
return jresult;
}
'개발 > Android' 카테고리의 다른 글
Android jni 에서 mbstowcs 사용 시 주의할 점... (0) | 2016.12.15 |
---|---|
누가버전에서 DT_NEEDED 오류창이 뜰 경우... (0) | 2016.11.10 |
Android JNI 연동 (0) | 2016.07.21 |