diff --git a/sdk/android/BUILD.gn b/sdk/android/BUILD.gn index 74223020b8..28546afcfd 100644 --- a/sdk/android/BUILD.gn +++ b/sdk/android/BUILD.gn @@ -488,6 +488,7 @@ rtc_android_library("libjingle_peerconnection_java") { "src/java/org/webrtc/Histogram.java", "src/java/org/webrtc/JniCommon.java", "src/java/org/webrtc/MediaCodecUtils.java", + "src/java/org/webrtc/NativeClassQualifiedName.java", "src/java/org/webrtc/NativeLibrary.java", "src/java/org/webrtc/NV12Buffer.java", "src/java/org/webrtc/NV21Buffer.java", diff --git a/sdk/android/src/java/org/webrtc/NativeClassQualifiedName.java b/sdk/android/src/java/org/webrtc/NativeClassQualifiedName.java new file mode 100644 index 0000000000..5adce75ce5 --- /dev/null +++ b/sdk/android/src/java/org/webrtc/NativeClassQualifiedName.java @@ -0,0 +1,31 @@ +/* + * Copyright 2017 The WebRTC project authors. All Rights Reserved. + * + * Use of this source code is governed by a BSD-style license + * that can be found in the LICENSE file in the root of the source + * tree. An additional intellectual property rights grant can be found + * in the file PATENTS. All contributing project authors may + * be found in the AUTHORS file in the root of the source tree. + */ + +package org.webrtc; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * @NativeClassQualifiedName is used by the JNI generator to create the necessary JNI + * bindings to call into the specified native class name. + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +public @interface NativeClassQualifiedName { + /* + * Tells which native class the method is going to be bound to. + * The first parameter of the annotated method must be an int nativePtr pointing to + * an instance of this class. + */ + public String value(); +} diff --git a/sdk/android/src/java/org/webrtc/VideoEncoderWrapper.java b/sdk/android/src/java/org/webrtc/VideoEncoderWrapper.java index 6d7924a91e..c7fd6cff4a 100644 --- a/sdk/android/src/java/org/webrtc/VideoEncoderWrapper.java +++ b/sdk/android/src/java/org/webrtc/VideoEncoderWrapper.java @@ -69,12 +69,13 @@ class VideoEncoderWrapper { @CalledByNative static VideoEncoder.Callback createEncoderCallback(final long nativeEncoder) { return (EncodedImage frame, VideoEncoder.CodecSpecificInfo info) - -> onEncodedFrame(nativeEncoder, frame.buffer, frame.encodedWidth, + -> nativeOnEncodedFrame(nativeEncoder, frame.buffer, frame.encodedWidth, frame.encodedHeight, frame.captureTimeNs, frame.frameType.getNative(), frame.rotation, frame.completeFrame, frame.qp); } - private static native void onEncodedFrame(long nativeEncoder, ByteBuffer buffer, int encodedWidth, - int encodedHeight, long captureTimeNs, int frameType, int rotation, boolean completeFrame, - Integer qp); + @NativeClassQualifiedName("webrtc::jni::VideoEncoderWrapper") + private static native void nativeOnEncodedFrame(long nativeEncoder, ByteBuffer buffer, + int encodedWidth, int encodedHeight, long captureTimeNs, int frameType, int rotation, + boolean completeFrame, Integer qp); } diff --git a/sdk/android/src/jni/jni_generator_helper.h b/sdk/android/src/jni/jni_generator_helper.h index 6cee9decef..7dec4f7a82 100644 --- a/sdk/android/src/jni/jni_generator_helper.h +++ b/sdk/android/src/jni/jni_generator_helper.h @@ -19,9 +19,12 @@ #include "sdk/android/src/jni/jni_helpers.h" #define CHECK_CLAZZ(env, jcaller, clazz, ...) RTC_DCHECK(clazz); +#define CHECK_NATIVE_PTR(env, jcaller, native_ptr, method_name, ...) \ + RTC_DCHECK(native_ptr) << method_name; #define BASE_EXPORT #define JNI_REGISTRATION_EXPORT __attribute__((visibility("default"))) +#define JNI_GENERATOR_EXPORT extern "C" JNIEXPORT JNICALL namespace jni_generator { inline void CheckException(JNIEnv* env) { @@ -70,6 +73,8 @@ class JavaRef { // using DeleteLocalRef though. template using ScopedJavaLocalRef = JavaRef; +template +using JavaParamRef = JavaRef; // This function will initialize |atomic_class_id| to contain a global ref to // the given class, and will return that ref on subsequent calls. The caller is diff --git a/sdk/android/src/jni/videoencoderwrapper.cc b/sdk/android/src/jni/videoencoderwrapper.cc index d85844c975..43b242db3f 100644 --- a/sdk/android/src/jni/videoencoderwrapper.cc +++ b/sdk/android/src/jni/videoencoderwrapper.cc @@ -192,6 +192,7 @@ const char* VideoEncoderWrapper::ImplementationName() const { } void VideoEncoderWrapper::OnEncodedFrame(JNIEnv* jni, + jobject j_caller, jobject j_buffer, jint encoded_width, jint encoded_height, @@ -402,25 +403,5 @@ std::string VideoEncoderWrapper::GetImplementationName(JNIEnv* jni) const { return JavaToStdString(jni, jname); } -JNI_FUNCTION_DECLARATION(void, - VideoEncoderWrapper_onEncodedFrame, - JNIEnv* jni, - jclass, - jlong j_native_encoder, - jobject buffer, - jint encoded_width, - jint encoded_height, - jlong capture_time_ns, - jint frame_type, - jint rotation, - jboolean complete_frame, - jobject qp) { - VideoEncoderWrapper* native_encoder = - reinterpret_cast(j_native_encoder); - native_encoder->OnEncodedFrame(jni, buffer, encoded_width, encoded_height, - capture_time_ns, frame_type, rotation, - complete_frame, qp); -} - } // namespace jni } // namespace webrtc diff --git a/sdk/android/src/jni/videoencoderwrapper.h b/sdk/android/src/jni/videoencoderwrapper.h index 7717eb8e43..06f59031bd 100644 --- a/sdk/android/src/jni/videoencoderwrapper.h +++ b/sdk/android/src/jni/videoencoderwrapper.h @@ -55,6 +55,7 @@ class VideoEncoderWrapper : public VideoEncoder { // Should only be called by JNI. void OnEncodedFrame(JNIEnv* jni, + jobject j_caller, jobject j_buffer, jint encoded_width, jint encoded_height,