问题描述
我有JNI方法,其中我试图调用Java方法。这是我的JNI code
I have JNI method where I am trying to call Java method. Here is my JNI code
void DummySink::afterGettingFrame(unsigned frameSize, unsigned numTruncatedBytes,
struct timeval presentationTime, unsigned /*durationInMicroseconds*/) {
__android_log_print(ANDROID_LOG_VERBOSE, "RTSP", "Frame: %c", propRec->sPropBytes);
jmethodID mid;
jclass handlerClass = env9->FindClass("ob/android/Stream");
if (handlerClass == NULL) {
__android_log_print(ANDROID_LOG_VERBOSE, "RTSP-Error", "Class");
}
mid = env9->GetMethodID(handlerClass, "onResponse", "([B)V");
if (mid == NULL) {
__android_log_print(ANDROID_LOG_VERBOSE, "RTSP-Error", "Method");
}
jbyteArray jbArray = env9->NewByteArray((int)propRec->sPropLength);
env9->SetByteArrayRegion(jbArray, 0, (int)propRec->sPropLength, (jbyte*)propRec->sPropBytes);
//jobject theClass = env9->FindClass("ob/android/Stream");
env9->CallVoidMethod(handlerClass, mid, jbArray);
}
下面是Java code,我有
Here is the Java code that I have
public void onResponse(byte[] str)
{
Log.v("Response", "Java");
}
我收到以下崩溃
I am receiving following crash
03-08 16:01:05.915: W/dalvikvm(17552): JNI WARNING: can't call Lob/android/Stream;.onResponse on instance of Ljava/lang/Class;
03-08 16:01:05.915: W/dalvikvm(17552): in Lob/android/Stream;.stream:()V (CallVoidMethodV)
将马的回答后,这里是个例外,我接受
After applying Mah's answer, here is the exception I am receiving
03-08 16:40:20.646: W/dalvikvm(4076): JNI WARNING: JNI method called with exception pending
03-08 16:40:20.646: W/dalvikvm(4076): in Lob/android/Stream;.stream:()V (NewByteArray)
03-08 16:40:20.646: W/dalvikvm(4076): Pending exception is:
03-08 16:40:20.646: I/dalvikvm(4076): java.lang.NoSuchMethodError: no method with name='onResponse' signature='([B)V' in class Lob/android/Stream;
03-08 16:40:20.646: I/dalvikvm(4076): at ob.android.Stream.stream(Native Method)
03-08 16:40:20.646: I/dalvikvm(4076): at ob.android.Stream.<init>(Stream.java:28)
03-08 16:40:20.654: I/dalvikvm(4076): at ob.android.MainActivity.startRecording(MainActivity.java:203)
现在onResponse方法是静态的。
Now onResponse method is static.
推荐答案
您的Java方法是一个实例方法(而不是静态的),但你的本地code是不是指 ob.android.Stream 来调用 onResponse()
为
Your Java method is an instance method (not static), but your native code isn't referring to any specific instance of ob.android.Stream
to call onResponse()
for.
在调用 CallVoidMethod()
,第一个参数是要实例(对象),你正在运行的方法对抗,而不是类本身。类本身会如果你使用可以使用 CallStaticVoidMethod()
。
When calling CallVoidMethod()
, the first parameter is to be the instance (object) you're running the method against, not the class itself. The class itself would be used if you were using CallStaticVoidMethod()
.
这篇关于的Android NDK:从JNI C级调用Java方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!