안녕하세요.
자바는 아래와 같이.. testCallback() 메소드가 있습니다. C에서 콜하면 어떤 동작을 하게 만들 함수이고요.. public static void testCallback() {
//String param Log.e("testCallback", "vvvvvv");
}
네이티브 쪽은, 아래와 같이 되어있습니다.
JNIEnv* getJNIEnv(JavaVM* jvm)
{
if (NULL == jvm) {
// LOGD("Failed to get JNIEnv. JniHelper::getJavaVM() is NULL");
return NULL;
}
JNIEnv *env = NULL;
// get jni environment
jint ret = jvm->GetEnv((void**)&env, JNI_VERSION_1_4);
switch (ret) {
case JNI_OK :
// Success!
return env;
case JNI_EDETACHED :
// Thread not attached
// TODO : If calling AttachCurrentThread() on a native thread
// must call DetachCurrentThread() in future.
// see: http://developer.android.com/guide/practices/design/jni.html
if (jvm->AttachCurrentThread(&env, NULL) < 0)
{
// LOGD("Failed to get the environment using AttachCurrentThread()");
return NULL;
} else {
// Success : Attached and obtained JNIEnv!
return env;
}
case JNI_EVERSION :
// Cannot recover from this error
// LOGD("JNI interface version 1.4 not supported");
default :
// LOGD("Failed to get the environment using GetEnv()");
return NULL;
}
}
// get class and make it a global reference, release it at endJni().
jclass getClassID(JNIEnv *pEnv, const char* className)
{
jclass ret = pEnv->FindClass(className);
if (! ret)
{
// LOGD("Failed to find class of %s", className);
}
return ret;
}
bool getStaticMethodInfo(JavaVM* jvm, JniMethodInfo &methodinfo, const char* className, const char *methodName, const char *paramCode)
{
jmethodID methodID = 0;
JNIEnv *pEnv = 0;
bool bRet = false;
do
{
pEnv = getJNIEnv(jvm);
if (! pEnv)
{
break;
}
jclass classID = getClassID(pEnv, className);
methodID = pEnv->GetStaticMethodID(classID, methodName, paramCode);
if (! methodID)
{
// LOGD("Failed to find static method id of %s", methodName);
break;
}
methodinfo.classID = classID;
methodinfo.env = pEnv;
methodinfo.methodID = methodID;
bRet = true;
} while (0);
return bRet;
}
void callback(JavaVM* jvm, const char* value){
JniMethodInfo methodInfo;
__android_log_print(ANDROID_LOG_INFO
, "callback"
, "%s:%d :: Log "
, __FUNCTION__
, __LINE__);
//Ljava/lang/String;
if (! getStaticMethodInfo(jvm, methodInfo, "nex/sample/myapplication/MainActivity", "testCallback", "()V"))
{
return;
}
jstring stringArg = methodInfo.env->NewStringUTF(value);
methodInfo.env->CallStaticVoidMethod(methodInfo.classID, methodInfo.methodID, stringArg);
methodInfo.env->DeleteLocalRef(stringArg);
methodInfo.env->DeleteLocalRef(methodInfo.classID);
}
이게 끝입니다.. 구글링하면 흔하게 나온 소스를 제 경로에 맞게 수정해서 사용했습니다.. testCallback() 를 호출 하려고 했으나 ,
if (! getStaticMethodInfo(jvm, methodInfo, "nex/sample/myapplication/MainActivity", "testCallback", "()V"))
{
return;
} // 여기에서 return; 되더라구요...;;; 몇일째 찾아봐도 샘플을 따라해도 해결이 되질않아서 질문드립니다 ㅜ 잘 못된 부분좀 도와주세요..