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);
}
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)
Now onResponse method is static.
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.
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()
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With