安卓NDK : calling java method from JNI C class

标签 android android-ndk

我有 JNI 方法,我正在尝试调用 Java 方法。这是我的 JNI 代码

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 代码

public void onResponse(byte[] str) 
    { 
        Log.v("Response", "Java");
    }

我收到以下崩溃

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)

应用 Mah 的答案后,这是我收到的异常

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 方法是静态的。

最佳答案

您的 Java 方法是一个实例方法(不是静态的),但是您的 native 代码没有引用 ob.android.Stream 的任何特定实例来调用 onResponse() 为。

当调用 CallVoidMethod() 时,第一个参数是您运行该方法所针对的实例(对象),而不是类本身。如果您使用 CallStaticVoidMethod(),则会使用该类本身。

关于安卓NDK : calling java method from JNI C class,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15292432/

相关文章:

android - 为 Android 实现 Facebook 登录按钮时出错

android - 线程同步@Native Android

安卓工作室 : New gradle build NDK sample app error

Android NDK : make: *** No rule to make target. 停止

c++ - 尝试使用 Android-NDK 生成 so 文件时,未在此范围内声明“runtime_error”

java - 如何将字符串从 Android 发送到 PHP?我的 PHP 脚本应该如何处理它?

android - 如何在Android操作系统中自定义iptable源代码版本4.0.4

android - 嵌套的垂直 RecyclerView

android - 如何调试从 'adb shell am start -D ' 开始的 android 应用程序?

android - NDK 将一个库链接到另一个库“无法加载库 : link_image[1966]: 1765 could not load needed library. ..”