GetMethodID找不到id - android JNI

时间:2014-03-21 21:19:26

标签: android c android-ndk

我对GetMethodID有点问题。

Java代码(简化):

package ch.geniali.Test.service;
public class Service extends Service {
    private void sendMessage(String message) {
        Intent intent = new Intent();
        intent.setAction(Const.ACTION_INFO);
        intent.putExtra(Const.INTENT_MESSAGE, message);
        sendBroadcast(intent);
    }
}

JNI方法:

#include <jni.h>
#include <string.h>
#include <android/log.h>
#define DEBUG_TAG "C_libG"

JavaVM* gJavaVM = NULL;
static JNIEnv *pEnv;
const char* kJavaClassPath = "ch/geniali/Test/service/Service";

JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM* pVm, void* reserved){
    __android_log_print(ANDROID_LOG_DEBUG, DEBUG_TAG, "Call JNI_OnLoad");

    gJavaVM = pVm;

    if((*pVm)->GetEnv(pVm, (void **)&pEnv, JNI_VERSION_1_6)){
        __android_log_print(ANDROID_LOG_DEBUG, DEBUG_TAG,
                    "Failed to get the environment");
        return -1;
    }

    jclass gClass = (*pEnv)->FindClass(pEnv, kJavaClassPath);
    if (!gClass)
     {
        __android_log_print(ANDROID_LOG_DEBUG, DEBUG_TAG,"failed to get %s class reference", kJavaClassPath);
      return -1;
     }

    jmethodID mid = (*pEnv)->GetMethodID(pEnv, gClass, "sendMessage", "(Ljava/lang/String;)V");
    if (mid == 0){
        __android_log_print(ANDROID_LOG_DEBUG, DEBUG_TAG,"Method ID not found");
        return -1;
    }

    (*pEnv)->CallVoidMethod(pEnv, gClass, mid, "yay!!!");

    return JNI_VERSION_1_6;
}
发现了gClass ..这没关系。但是,找不到jmethodID。我不知道为什么。

logcat对我没有帮助。

03-21 20:46:07.059 16182-16182 / ch.geniali.Test:Task D / C_libG Call JNI_OnLoad

03-21 20:46:07.059 16182-16182 / ch.geniali.Test:任务W / dalvikvm? JNI警告:不能在Ljava / lang / Class的实例上调用Lch / geniali / Test / service / Service; .sendMessage; (CallVoidMethod)

03-21 20:46:07.059 16182-16182 / ch.geniali.Test:任务W / dalvikvm?在Ljava / lang / Runtime; .nativeLoad :( Ljava / lang / String; Ljava / lang / ClassLoader; Ljava / lang / String;)Ljava / lang / String; (CallVoidMethod)

03-21 20:46:07.059 16182-16182 / ch.geniali.Test:任务I / dalvikvm? “main”prio = 5 tid = 1 RUNNABLE

2 个答案:

答案 0 :(得分:1)

正确找到方法ID,否则您会看到

__android_log_print(ANDROID_LOG_DEBUG, DEBUG_TAG,"Method ID not found");
Android日志中的

消息。

您的错误是您尝试通过

调用sendMessage()对象上的java.lang.Class方法
(*pEnv)->CallVoidMethod(pEnv, **gClass**, mid, "yay!!!");

gClass 是Service.class引用,不是Service实例。

答案 1 :(得分:0)

也许是访问权限,您是否可以将“sendMessage”方法的访问标签更改为public?通常,您无法使用对象访问私有方法。

public void sendMessage(String message) {
        Intent intent = new Intent();
        intent.setAction(Const.ACTION_INFO);
        intent.putExtra(Const.INTENT_MESSAGE, message);
        sendBroadcast(intent);
    }