티스토리 뷰

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;

}














공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/05   »
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 31
글 보관함