1
+ //
2
+ // Created by Administrator on 2019/1/29/029.
3
+ //
4
+
5
+ #include < jni.h>
6
+ #include < stddef.h>
7
+ #include " lib/raop.h"
8
+ #include " log.h"
9
+ #include " lib/stream.h"
10
+ #include " lib/logger.h"
11
+ #include < malloc.h>
12
+ #include < cstring>
13
+
14
+ static JavaVM* g_JavaVM;
15
+
16
+ void OnRecvAudioData (void *observer, pcm_data_struct *data) {
17
+ jobject obj = (jobject) observer;
18
+ JNIEnv* jniEnv = NULL ;
19
+ g_JavaVM->AttachCurrentThread (&jniEnv, NULL );
20
+ jclass cls = jniEnv->GetObjectClass (obj);
21
+ jmethodID onRecvVideoDataM = jniEnv->GetMethodID (cls, " onRecvAudioData" , " ([SJ)V" );
22
+ jniEnv->DeleteLocalRef (cls);
23
+ jshortArray sarr = jniEnv->NewShortArray (data->data_len );
24
+ if (sarr == NULL ) return ;
25
+ jniEnv->SetShortArrayRegion (sarr, (jint) 0 , data->data_len , (jshort *) data->data );
26
+ jniEnv->CallVoidMethod (obj, onRecvVideoDataM, sarr, data->pts );
27
+ jniEnv->DeleteLocalRef (sarr);
28
+ g_JavaVM->DetachCurrentThread ();
29
+ }
30
+
31
+
32
+ void OnRecvVideoData (void *observer, h264_decode_struct *data) {
33
+ jobject obj = (jobject) observer;
34
+ JNIEnv* jniEnv = NULL ;
35
+ g_JavaVM->AttachCurrentThread (&jniEnv, NULL );
36
+ jclass cls = jniEnv->GetObjectClass (obj);
37
+ jmethodID onRecvVideoDataM = jniEnv->GetMethodID (cls, " onRecvVideoData" , " ([BIJJ)V" );
38
+ jniEnv->DeleteLocalRef (cls);
39
+ jbyteArray barr = jniEnv->NewByteArray (data->data_len );
40
+ if (barr == NULL ) return ;
41
+ jniEnv->SetByteArrayRegion (barr, (jint) 0 , data->data_len , (jbyte *) data->data );
42
+ jniEnv->CallVoidMethod (obj, onRecvVideoDataM, barr, data->frame_type ,
43
+ data->pts , data->pts );
44
+ jniEnv->DeleteLocalRef (barr);
45
+ g_JavaVM->DetachCurrentThread ();
46
+ }
47
+
48
+ extern " C" void
49
+ audio_process (void *cls, pcm_data_struct *data)
50
+ {
51
+ OnRecvAudioData (cls, data);
52
+ }
53
+
54
+ extern " C" void
55
+ audio_set_volume (void *cls, void *opaque, float volume)
56
+ {
57
+
58
+ }
59
+
60
+ extern " C" void
61
+ video_process (void *cls, h264_decode_struct *data)
62
+ {
63
+ OnRecvVideoData (cls, data);
64
+ }
65
+
66
+ extern " C" void
67
+ log_callback (void *cls, int level, const char *msg) {
68
+ switch (level) {
69
+ case LOGGER_DEBUG: {
70
+ LOGD (" %s" , msg);
71
+ break ;
72
+ }
73
+ case LOGGER_WARNING: {
74
+ LOGW (" %s" , msg);
75
+ break ;
76
+ }
77
+ case LOGGER_INFO: {
78
+ LOGI (" %s" , msg);
79
+ break ;
80
+ }
81
+ case LOGGER_ERR: {
82
+ LOGE (" %s" , msg);
83
+ break ;
84
+ }
85
+ default :break ;
86
+ }
87
+
88
+ }
89
+
90
+ extern " C" JNIEXPORT jint JNICALL
91
+ JNI_OnLoad (JavaVM* vm, void * reserved) {
92
+ g_JavaVM = vm;
93
+ return JNI_VERSION_1_6;
94
+ }
95
+
96
+ extern " C" JNIEXPORT jlong JNICALL
97
+ Java_com_fang_myapplication_RaopServer_start (JNIEnv* env, jobject object) {
98
+ raop_t *raop;
99
+ raop_callbacks_t raop_cbs;
100
+ memset (&raop_cbs, 0 , sizeof (raop_cbs));
101
+ raop_cbs.cls = (void *) env->NewGlobalRef (object);;
102
+ raop_cbs.audio_process = audio_process;
103
+ raop_cbs.audio_set_volume = audio_set_volume;
104
+ raop_cbs.video_process = video_process;
105
+ raop = raop_init (10 , &raop_cbs);
106
+ if (raop == NULL ) {
107
+ LOGE (" raop = NULL" );
108
+ return 0 ;
109
+ } else {
110
+ LOGD (" raop init success" );
111
+ }
112
+
113
+ raop_set_log_callback (raop, log_callback, NULL );
114
+ raop_set_log_level (raop, RAOP_LOG_DEBUG);
115
+
116
+ unsigned short port = 0 ;
117
+ raop_start (raop, &port);
118
+ raop_set_port (raop, port);
119
+ LOGD (" raop port = % d" , raop_get_port (raop));
120
+ return (jlong) (void *) raop;
121
+ }
122
+
123
+ extern " C" JNIEXPORT jint JNICALL
124
+ Java_com_fang_myapplication_RaopServer_getPort (JNIEnv* env, jobject object, jlong opaque) {
125
+ raop_t *raop = (raop_t *) (void *) opaque;
126
+ return raop_get_port (raop);
127
+ }
128
+
129
+ extern " C" JNIEXPORT void JNICALL
130
+ Java_com_fang_myapplication_RaopServer_stop (JNIEnv* env, jobject object, jlong opaque) {
131
+ raop_t *raop = (raop_t *) (void *) opaque;
132
+ jobject obj = (jobject) raop_get_callback_cls (raop);
133
+ raop_destroy (raop);
134
+ env->DeleteGlobalRef (obj);
135
+
136
+ }
0 commit comments