Android: Generate JNI code for IceCandidate
Bug: webrtc:8278 Change-Id: I4facd1f6babd6e8a9b35c86b6ad7420e52321f49 Reviewed-on: https://webrtc-review.googlesource.com/25960 Reviewed-by: Sami Kalliomäki <sakal@webrtc.org> Commit-Queue: Magnus Jedvert <magjed@webrtc.org> Cr-Commit-Position: refs/heads/master@{#20888}
This commit is contained in:
committed by
Commit Bot
parent
5b8c0a2a1e
commit
80610c4fd1
@ -68,7 +68,6 @@ ClassReferenceHolder::ClassReferenceHolder(JNIEnv* jni) {
|
||||
LoadClass(jni, "org/webrtc/EglBase14$Context");
|
||||
LoadClass(jni, "org/webrtc/EncodedImage");
|
||||
LoadClass(jni, "org/webrtc/EncodedImage$FrameType");
|
||||
LoadClass(jni, "org/webrtc/IceCandidate");
|
||||
LoadClass(jni, "org/webrtc/MediaCodecVideoDecoder");
|
||||
LoadClass(jni, "org/webrtc/MediaCodecVideoDecoder$DecodedOutputBuffer");
|
||||
LoadClass(jni, "org/webrtc/MediaCodecVideoDecoder$DecodedTextureBuffer");
|
||||
|
||||
@ -13,11 +13,27 @@
|
||||
#include <string>
|
||||
|
||||
#include "pc/webrtcsdp.h"
|
||||
#include "sdk/android/generated_peerconnection_jni/jni/IceCandidate_jni.h"
|
||||
#include "sdk/android/src/jni/classreferenceholder.h"
|
||||
|
||||
namespace webrtc {
|
||||
namespace jni {
|
||||
|
||||
namespace {
|
||||
|
||||
jobject NativeToJavaCandidate(JNIEnv* env,
|
||||
const std::string& sdp_mid,
|
||||
int sdp_mline_index,
|
||||
const std::string& sdp,
|
||||
const std::string server_url) {
|
||||
return Java_IceCandidate_Constructor(
|
||||
env, JavaStringFromStdString(env, sdp_mid), sdp_mline_index,
|
||||
JavaStringFromStdString(env, sdp),
|
||||
JavaStringFromStdString(env, server_url));
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
jobject NativeToJavaMediaType(JNIEnv* jni, cricket::MediaType media_type) {
|
||||
jclass j_media_type_class =
|
||||
FindClass(jni, "org/webrtc/MediaStreamTrack$MediaType");
|
||||
@ -58,15 +74,10 @@ cricket::MediaType JavaToNativeMediaType(JNIEnv* jni, jobject j_media_type) {
|
||||
}
|
||||
|
||||
cricket::Candidate JavaToNativeCandidate(JNIEnv* jni, jobject j_candidate) {
|
||||
jclass j_candidate_class = GetObjectClass(jni, j_candidate);
|
||||
jfieldID j_sdp_mid_id =
|
||||
GetFieldID(jni, j_candidate_class, "sdpMid", "Ljava/lang/String;");
|
||||
std::string sdp_mid =
|
||||
JavaToStdString(jni, GetStringField(jni, j_candidate, j_sdp_mid_id));
|
||||
jfieldID j_sdp_id =
|
||||
GetFieldID(jni, j_candidate_class, "sdp", "Ljava/lang/String;");
|
||||
JavaToStdString(jni, Java_IceCandidate_getSdpMid(jni, j_candidate));
|
||||
std::string sdp =
|
||||
JavaToStdString(jni, GetStringField(jni, j_candidate, j_sdp_id));
|
||||
JavaToStdString(jni, Java_IceCandidate_getSdp(jni, j_candidate));
|
||||
cricket::Candidate candidate;
|
||||
if (!SdpDeserializeCandidate(sdp_mid, sdp, &candidate, NULL)) {
|
||||
RTC_LOG(LS_ERROR) << "SdpDescrializeCandidate failed with sdp " << sdp;
|
||||
@ -74,32 +85,33 @@ cricket::Candidate JavaToNativeCandidate(JNIEnv* jni, jobject j_candidate) {
|
||||
return candidate;
|
||||
}
|
||||
|
||||
jobject NativeToJavaCandidate(JNIEnv* jni,
|
||||
jclass* candidate_class,
|
||||
jobject NativeToJavaCandidate(JNIEnv* env,
|
||||
const cricket::Candidate& candidate) {
|
||||
std::string sdp = SdpSerializeCandidate(candidate);
|
||||
RTC_CHECK(!sdp.empty()) << "got an empty ICE candidate";
|
||||
jmethodID ctor = GetMethodID(jni, *candidate_class, "<init>",
|
||||
"(Ljava/lang/String;ILjava/lang/String;)V");
|
||||
jstring j_mid = JavaStringFromStdString(jni, candidate.transport_name());
|
||||
jstring j_sdp = JavaStringFromStdString(jni, sdp);
|
||||
// sdp_mline_index is not used, pass an invalid value -1.
|
||||
jobject j_candidate =
|
||||
jni->NewObject(*candidate_class, ctor, j_mid, -1, j_sdp);
|
||||
CHECK_EXCEPTION(jni) << "error during Java Candidate NewObject";
|
||||
return j_candidate;
|
||||
return NativeToJavaCandidate(env, candidate.transport_name(),
|
||||
-1 /* sdp_mline_index */, sdp,
|
||||
"" /* server_url */);
|
||||
}
|
||||
|
||||
jobject NativeToJavaCandidate(JNIEnv* env,
|
||||
const IceCandidateInterface& candidate) {
|
||||
std::string sdp;
|
||||
RTC_CHECK(candidate.ToString(&sdp)) << "got so far: " << sdp;
|
||||
return NativeToJavaCandidate(env, candidate.sdp_mid(),
|
||||
candidate.sdp_mline_index(), sdp,
|
||||
candidate.candidate().url());
|
||||
}
|
||||
|
||||
jobjectArray NativeToJavaCandidateArray(
|
||||
JNIEnv* jni,
|
||||
const std::vector<cricket::Candidate>& candidates) {
|
||||
jclass candidate_class = FindClass(jni, "org/webrtc/IceCandidate");
|
||||
jobjectArray java_candidates =
|
||||
jni->NewObjectArray(candidates.size(), candidate_class, NULL);
|
||||
Java_IceCandidate_createArray(jni, candidates.size());
|
||||
int i = 0;
|
||||
for (const cricket::Candidate& candidate : candidates) {
|
||||
jobject j_candidate =
|
||||
NativeToJavaCandidate(jni, &candidate_class, candidate);
|
||||
jobject j_candidate = NativeToJavaCandidate(jni, candidate);
|
||||
jni->SetObjectArrayElement(java_candidates, i++, j_candidate);
|
||||
}
|
||||
return java_candidates;
|
||||
|
||||
@ -36,9 +36,10 @@ jobject NativeToJavaMediaType(JNIEnv* jni, cricket::MediaType media_type);
|
||||
|
||||
cricket::Candidate JavaToNativeCandidate(JNIEnv* jni, jobject j_candidate);
|
||||
|
||||
jobject NativeToJavaCandidate(JNIEnv* jni,
|
||||
jclass* candidate_class,
|
||||
const cricket::Candidate& candidate);
|
||||
jobject NativeToJavaCandidate(JNIEnv* env, const cricket::Candidate& candidate);
|
||||
|
||||
jobject NativeToJavaCandidate(JNIEnv* env,
|
||||
const IceCandidateInterface& candidate);
|
||||
|
||||
jobjectArray NativeToJavaCandidateArray(
|
||||
JNIEnv* jni,
|
||||
|
||||
@ -61,23 +61,14 @@ PeerConnectionObserverJni::~PeerConnectionObserverJni() {
|
||||
|
||||
void PeerConnectionObserverJni::OnIceCandidate(
|
||||
const IceCandidateInterface* candidate) {
|
||||
ScopedLocalRefFrame local_ref_frame(jni());
|
||||
std::string sdp;
|
||||
RTC_CHECK(candidate->ToString(&sdp)) << "got so far: " << sdp;
|
||||
jclass candidate_class = FindClass(jni(), "org/webrtc/IceCandidate");
|
||||
jmethodID ctor =
|
||||
GetMethodID(jni(), candidate_class, "<init>",
|
||||
"(Ljava/lang/String;ILjava/lang/String;Ljava/lang/String;)V");
|
||||
jstring j_mid = JavaStringFromStdString(jni(), candidate->sdp_mid());
|
||||
jstring j_sdp = JavaStringFromStdString(jni(), sdp);
|
||||
jstring j_url = JavaStringFromStdString(jni(), candidate->candidate().url());
|
||||
jobject j_candidate = jni()->NewObject(
|
||||
candidate_class, ctor, j_mid, candidate->sdp_mline_index(), j_sdp, j_url);
|
||||
CHECK_EXCEPTION(jni()) << "error during NewObject";
|
||||
jmethodID m = GetMethodID(jni(), *j_observer_class_, "onIceCandidate",
|
||||
JNIEnv* env = AttachCurrentThreadIfNeeded();
|
||||
ScopedLocalRefFrame local_ref_frame(env);
|
||||
jobject j_candidate = NativeToJavaCandidate(env, *candidate);
|
||||
|
||||
jmethodID m = GetMethodID(env, *j_observer_class_, "onIceCandidate",
|
||||
"(Lorg/webrtc/IceCandidate;)V");
|
||||
jni()->CallVoidMethod(*j_observer_global_, m, j_candidate);
|
||||
CHECK_EXCEPTION(jni()) << "error during CallVoidMethod";
|
||||
env->CallVoidMethod(*j_observer_global_, m, j_candidate);
|
||||
CHECK_EXCEPTION(env) << "error during CallVoidMethod";
|
||||
}
|
||||
|
||||
void PeerConnectionObserverJni::OnIceCandidatesRemoved(
|
||||
|
||||
Reference in New Issue
Block a user