안녕하세요.
계속 눈으로 보기만 하다가 처음으로 질문을 올립니다.^^

현재 체육샘님의 강좌를 토대로 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; 
}