我对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
答案 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);
}