首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >通过JNI从Android上的C++调用Java函数

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

Stack Overflow用户
提问于 2012-02-24 17:01:48
回答 2查看 6.5K关注 0票数 2

我正在使用JNI从安卓系统调用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部分:

代码语言:javascript
复制
public class Main extends Activity  
{   
    public  native  String  JNIInit();

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

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

代码语言:javascript
复制
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:我知道这里有几个关于这个话题的帖子,但我无论如何都不能让它工作。一定有什么东西我只是错过了,我只是不能弄清楚是什么。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-02-24 17:27:07

可以尝试使用:(*env)->GetObjectClass(env, obj);而不是FindClass

票数 2
EN

Stack Overflow用户

发布于 2012-02-24 17:18:19

您已经在c++中创建了一个空字符串,并从方法中传递了来自java的空字符串

代码语言:javascript
复制
 jString pSrc = (*env)->GetString(env,source, 0);

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

代码语言:javascript
复制
 (*env)->String(env, source, pSrc , 0);

以及最终的用途

代码语言:javascript
复制
(*env)->ReleaseString(env,source, pSrc , 0);
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9428001

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档