안드로이드 개발 질문/답변
(글 수 40,700)
안녕하세요.
계속 눈으로 보기만 하다가 처음으로 질문을 올립니다.^^
현재 체육샘님의 강좌를 토대로 jni-hello , wolf3D 등의 예제를 돌려보고 소스 분석을 하였습니다.
http://www.androidpub.com/android_dev_info/82637
cygwin + NDK 1.6 입니다.
그 후 여러가지 테스트를 해 보고 있는데
자바에서 C 함수를 호출하는 것은 잘 되나, C코드에서 자바 메소드를 호출하는 것이 안됩니다..
흐름은 다음과 같습니다.
1. (자바 클래스) 자바에서 C의 add라는 함수를 호출하면
2. ( C 클래스) 두 개의 int를 더하고
3. ( C 클래스) 자바의 multiPle 메소드를 호출하여 결과값 * 2를 한 후 자바로 리턴해주면
4. (자바 클래스) 자바에서 TextView에 결과값을 보여주는 것입니다.
그리고 질문이 한가지 더 있습니다.
체육샘님의 강좌에서는 javah를 사용하여 헤더파일을 만드는 것에 대한 내용이 없는데 이런 저런 강좌를 보니
헤더를 만들라는 이야기가 많더군요. 하지만 헤더를 만들지 않아도 자바에서 C코드 호출은 잘 되기에
헤더를 만들어야 하는지 모르겠습니다.
또한 wolf3D 소스에서는 JNI_CreateJavaVM 함수를 사용하지 않는데 여러 강좌에서 이야기 하길,
C에서 자바 메소드를 호출할때는 저 함수를 사용하라고 되어있습니다.
하지만 wolf3D 소스에서는 그 함수를 사용하지 않고 (*env)->GetJavaVM(env, &g_VM) 를 사용하더군요.
이 부분도 개념이 없어서 잘 모르겠습니다.
질문이 세 가지나 되고 소스도 길어서 송구스럽습니다.
고수님들 지나가시다가 힌트라도 부탁드립니다..
JNITest.java
계속 눈으로 보기만 하다가 처음으로 질문을 올립니다.^^
현재 체육샘님의 강좌를 토대로 jni-hello , wolf3D 등의 예제를 돌려보고 소스 분석을 하였습니다.
http://www.androidpub.com/android_dev_info/82637
cygwin + NDK 1.6 입니다.
그 후 여러가지 테스트를 해 보고 있는데
자바에서 C 함수를 호출하는 것은 잘 되나, C코드에서 자바 메소드를 호출하는 것이 안됩니다..
흐름은 다음과 같습니다.
1. (자바 클래스) 자바에서 C의 add라는 함수를 호출하면
2. ( C 클래스) 두 개의 int를 더하고
3. ( C 클래스) 자바의 multiPle 메소드를 호출하여 결과값 * 2를 한 후 자바로 리턴해주면
4. (자바 클래스) 자바에서 TextView에 결과값을 보여주는 것입니다.
그리고 질문이 한가지 더 있습니다.
체육샘님의 강좌에서는 javah를 사용하여 헤더파일을 만드는 것에 대한 내용이 없는데 이런 저런 강좌를 보니
헤더를 만들라는 이야기가 많더군요. 하지만 헤더를 만들지 않아도 자바에서 C코드 호출은 잘 되기에
헤더를 만들어야 하는지 모르겠습니다.
또한 wolf3D 소스에서는 JNI_CreateJavaVM 함수를 사용하지 않는데 여러 강좌에서 이야기 하길,
C에서 자바 메소드를 호출할때는 저 함수를 사용하라고 되어있습니다.
하지만 wolf3D 소스에서는 그 함수를 사용하지 않고 (*env)->GetJavaVM(env, &g_VM) 를 사용하더군요.
이 부분도 개념이 없어서 잘 모르겠습니다.
질문이 세 가지나 되고 소스도 길어서 송구스럽습니다.
고수님들 지나가시다가 힌트라도 부탁드립니다..
JNITest.java
package kr.co.bns.JNITest;
import android.app.Activity; import android.os.Bundle; import android.widget.TextView;
public class JNITest extends Activity { private int lastResult = 0; static {System.loadLibrary("calc");} /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); TextView tv = new TextView(this); /* C 함수 호출 */ lastResult = add(5, 9); tv.setText("Result : " + lastResult); setContentView(tv); } /* C Native 함수명 */ public native int add(int a, int b); }
MultiClass.java
package kr.co.bns.JNITest;
public class MultiClass { /* C -> Java 호출 할 메소드 */ static public int multiPle(int tempResult) throws Exception { return tempResult * 2; } }
calc.c
#include <string.h> #include <jni.h> //#include "jni_calc.h"
static JavaVM *g_VM; jclass jNativesCls; jmethodID jMultiMethod;
extern int jni_callFunc(int tempResult);
jint Java_kr_co_bns_JNITest_JNITest_add( JNIEnv* env, jobject thiz, jint a, jint b ) { int tempAdd; int lastResult_c; (*env)->GetJavaVM(env, &g_VM); jNativesCls = (*env)->FindClass(env, "kr/co/bns/JNITest/MultiClass");
if ( jNativesCls == 0 ) { return -1; }
jMultiMethod = (*env)->GetStaticMethodID( env, jNativesCls, "multiPle", "(I)V" );
tempAdd = a + b; lastResult_c = jni_callFunc(tempAdd);
return tempAdd; }
/* Java 메소드 호출하는 함수 */ int jni_callFunc(int tempResult) { int resultFromJava; JNIEnv *env;
if ( !g_VM) { return; }
(*g_VM)->AttachCurrentThread (g_VM, (void **) &env, NULL); if ( jMultiMethod == 0 ) return -1; // Call Java method if (jMultiMethod) { resultFromJava = (*env)->CallStaticIntMethod( env, jNativesCls, jMultiMethod, tempResult ); } return resultFromJava; }
-> Java.lang.NoSuchMethodError: Multiple
하지만 Class는 제대로 잡아지는데 왜 메소드는 못찾는지 모르겠습니다.
calc.c 의 아래 부분을 호출하면 multiPle을 못찾겠다고 에러가 납니다.