通过JNI从Android上的C ++调用Java函数

时间:2012-02-24 09:01:48

标签: java android c++ java-native-interface

我使用JNI 从Android调用 C ++,到目前为止它的工作原理。现在我需要在C ++函数中使用Java的一些功能,并尝试从C ++回调Java。我在网上检查了stackoverflow和其他来源的各种解决方案,但我不知何故无法让它工作。

我总是得到以下例外“W/dalvikvm(358): JNI WARNING: can't call Lcom/main/Main;.message on instance of Lcom/main/Main;

有人可以就此提出任何建议吗?我是否错过了什么,监督某些事情或者只是错误的代码?

以下是我想从C ++调用的Java部分:

public class Main extends Activity  
{   
    public  native  String  JNIInit();

    String message(String text)
    {   text = text + "from java";
        return text;
    }
    .
    .
}

这是我可以从Java成功调用的 C ++ 函数,但是我无法回调Java:

extern "C" JNIEXPORT jstring JNICALL Java_com_main_Main_JNIInit(JNIEnv* env, jobject obj)
{   jstring jstr = env->NewStringUTF("From jni");
    jclass cls = env->FindClass("com/main/Main");
    jmethodID method = env->GetMethodID(cls, "message", "(Ljava/lang/String;)Ljava/lang/String;");
    jobject result = env->CallObjectMethod(obj, method, jstr);
    return env->NewStringUTF(str);
}

PS:我知道这个主题有几个主题,但无论如何我都无法正常工作。必须有一些我错过的东西,而我根本无法弄清楚那是什么。

2 个答案:

答案 0 :(得分:2)

您可以尝试使用FindClass

,而不是使用(*env)->GetObjectClass(env, obj);

答案 1 :(得分:-1)

你有用 在c ++中创建一个空字符串,并从方法

中传递来自java的空字符串
 jString pSrc = (*env)->GetString(env,source, 0);

//这里的source是你从java方法传递的空字符串 现在你将字符串复制到源

 (*env)->String(env, source, pSrc , 0);

并最终使用

(*env)->ReleaseString(env,source, pSrc , 0);