SoftbusPublish.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254
  1. #include <stdio.h>
  2. #include <unistd.h>
  3. #include <string.h>
  4. #include <jni.h>
  5. #include "securec.h"
  6. #include "discovery_service.h"
  7. #include "softbus_bus_center.h"
  8. #include "com_jg_softbus_naservice_PublishService.h"
  9. // 全局变量,用于保存Java虚拟机的引用
  10. JavaVM *jvm;
  11. //全局引用变量,用于保存java对象
  12. jobject globalRef;
  13. /**
  14. * 解析对象为c的PublishInfo结构
  15. */
  16. int ParsePublishInfo(JNIEnv *env, jobject pInfo, PublishInfo *info) {
  17. jclass infoClass = (*env)->GetObjectClass(env, pInfo);
  18. // 获取publishId
  19. jmethodID getPublishIdMethod = (*env)->GetMethodID(env, infoClass, "getPublishId", "()I");
  20. jint publishId = (*env)->CallIntMethod(env, pInfo, getPublishIdMethod);
  21. info->publishId = publishId;
  22. printf("PublishInfo->publishId:%d\n", publishId);
  23. //获取mode
  24. jmethodID getDiscoverModeMethod = (*env)->GetMethodID(env, infoClass, "getMode", "()Lcom/jg/softbus/discovery/enums/DiscoverMode;");
  25. jobject modeInfo = (*env)->CallObjectMethod(env, pInfo, getDiscoverModeMethod);
  26. jclass modeClass = (*env)->GetObjectClass(env, modeInfo);
  27. jmethodID getModeMethod = (*env)->GetMethodID(env, modeClass, "valueOf", "()I");
  28. jint mode = (*env)->CallIntMethod(env, modeInfo, getModeMethod);
  29. info->mode = mode;
  30. (*env)->DeleteLocalRef(env,modeInfo);
  31. printf("PublishInfo->mode:%d\n", mode);
  32. //获取medium
  33. jmethodID getMediumMethod = (*env)->GetMethodID(env, infoClass, "getMedium", "()Lcom/jg/softbus/discovery/enums/ExchangeMedium;");
  34. jobject mediumInfo = (*env)->CallObjectMethod(env, pInfo, getMediumMethod);
  35. jclass mediumClass = (*env)->GetObjectClass(env, mediumInfo);
  36. jmethodID getMediumMethod2 = (*env)->GetMethodID(env, mediumClass, "valueOf", "()I");
  37. jint medium = (*env)->CallIntMethod(env, mediumInfo, getMediumMethod2);
  38. info->medium = medium;
  39. (*env)->DeleteLocalRef(env, mediumInfo);
  40. printf("PublishInfo->medium:%d\n", medium);
  41. //获取freq频次
  42. jmethodID getFreqMethod = (*env)->GetMethodID(env, infoClass, "getFreq", "()Lcom/jg/softbus/discovery/enums/ExchangeFreq;");
  43. jobject freqInfo = (*env)->CallObjectMethod(env, pInfo, getFreqMethod);
  44. jclass freqClass = (*env)->GetObjectClass(env, freqInfo);
  45. jmethodID getFreqMethod2 = (*env)->GetMethodID(env, freqClass, "valueOf", "()I");
  46. jint freq = (*env)->CallIntMethod(env, freqInfo, getFreqMethod2);
  47. info->freq = freq;
  48. (*env)->DeleteLocalRef(env, freqInfo);
  49. printf("PublishInfo->freq:%d\n", freq);
  50. //获取capability
  51. jmethodID getCapabilityMethod = (*env)->GetMethodID(env, infoClass, "getCapability", "()Ljava/lang/String;");
  52. jstring capability = (*env)->CallObjectMethod(env, pInfo, getCapabilityMethod);
  53. const char *capabilityStr = (*env)->GetStringUTFChars(env, capability, 0);
  54. info->capability=capabilityStr;
  55. if(info->capability == NULL) {
  56. info->capability = "osdCapability";
  57. }
  58. (*env)->ReleaseStringUTFChars(env, capability, capabilityStr);
  59. printf("PublishInfo->capability:%s\n", capabilityStr);
  60. //获取capabilityData
  61. jmethodID getCapabilityDataMethod = (*env)->GetMethodID(env, infoClass, "getCapabilityData", "()Ljava/lang/String;");
  62. jstring capabilityData = (*env)->CallObjectMethod(env, pInfo, getCapabilityDataMethod);
  63. const char *capabilityDataStr = (*env)->GetStringUTFChars(env, capabilityData, 0);
  64. strcpy(info->capabilityData, capabilityDataStr);
  65. if(info->capabilityData == NULL) {
  66. info->capabilityData = NULL;
  67. }
  68. (*env)->ReleaseStringUTFChars(env, capabilityData, capabilityDataStr);
  69. printf("PublishInfo->capabilityData:%s\n", capabilityDataStr);
  70. //获取数据长度
  71. jmethodID getDataLenMethod = (*env)->GetMethodID(env, infoClass, "getDataLen", "()I");
  72. info->dataLen = (*env)->CallIntMethod(env, pInfo, getDataLenMethod);
  73. printf("PublishInfo->dataLen:%d\n", info->dataLen);
  74. //获取ranging bool类型
  75. //jmethodID getRangingMethod = (*env)->GetMethodID(env, infoClass, "getRanging", "()Z");
  76. //info->ranging = (*env)->CallBooleanMethod(env, pInfo, getRangingMethod);
  77. //printf("PublishInfo->ranging:%d\n", info->ranging);
  78. return 0;
  79. }
  80. /**
  81. * 发布成功回调处理
  82. */
  83. void PublishSuc(int publishId)
  84. {
  85. // 获取JNIEnv环境
  86. JNIEnv *env;
  87. // 将当前线程附加到Java虚拟机
  88. (*jvm)->AttachCurrentThread(jvm, (void **)&env, NULL);
  89. // 获取当前对象的类引用
  90. jclass nativeLibClass = (*env)->GetObjectClass(env, globalRef);
  91. // 获取当前对象的publishSuccess方法的ID
  92. jmethodID callbackMethod = (*env)->GetMethodID(env, nativeLibClass, "onPublishSuccess", "(I)V");
  93. // 调用当前对象的非静态方法
  94. (*env)->CallVoidMethod(env, globalRef, callbackMethod, publishId);
  95. // 将当前线程从Java虚拟机分离
  96. (*jvm)->DetachCurrentThread(jvm);
  97. printf("<PublishSuc>CB: publish %d done\n", publishId);
  98. }
  99. /**
  100. * 发布失败回调处理
  101. */
  102. void PublishFailed(int publishId, PublishFailReason reason)
  103. {
  104. // 获取JNIEnv环境
  105. JNIEnv *env;
  106. // 将当前线程附加到Java虚拟机
  107. (*jvm)->AttachCurrentThread(jvm, (void **)&env, NULL);
  108. // 获取当前对象的类引用
  109. jclass nativeLibClass = (*env)->GetObjectClass(env, globalRef);
  110. // 获取当前对象的publishSuccess方法的ID
  111. jmethodID callbackMethod = (*env)->GetMethodID(env, nativeLibClass, "onPublishFail", "(II)V");
  112. // 调用当前对象的非静态方法
  113. (*env)->CallVoidMethod(env, globalRef, callbackMethod, publishId, (int)reason);
  114. // 将当前线程从Java虚拟机分离
  115. (*jvm)->DetachCurrentThread(jvm);
  116. printf("<PublishFailed>CB: publish %d failed, reason=%d\n", publishId, (int)reason);
  117. }
  118. /**
  119. * 发布服务
  120. */
  121. JNIEXPORT jint JNICALL Java_com_jg_softbus_naservice_PublishService_publishService
  122. (JNIEnv *env, jobject obj, jstring pkgName, jobject publishInfo, jobject callback) {
  123. // 保存Java虚拟机的引用
  124. (*env)->GetJavaVM(env, &jvm);
  125. globalRef = (*env)->NewGlobalRef(env, callback);
  126. //包名处理
  127. const char *pkgNameStr = (*env)->GetStringUTFChars(env, pkgName, NULL);
  128. PublishInfo info;
  129. int ret = ParsePublishInfo(env, publishInfo, &info);
  130. if(ret != 0) {
  131. // 尝试进行一些可能会抛出异常的操作
  132. jclass exceptionClass = (*env)->FindClass(env, "java/lang/Exception"); // 获取异常类
  133. // 如果找不到异常类,则抛出异常
  134. jmethodID exceptionConstructor = (*env)->GetMethodID(env, exceptionClass, "<init>", "()V");
  135. jthrowable exception = (*env)->NewObject(env, exceptionClass, exceptionConstructor);
  136. // 抛出异常
  137. (*env)->ThrowNew(env, exceptionClass, "PublishInfo object error.");
  138. //解析失败无法继续操作
  139. return -1;
  140. }
  141. IPublishCallback cb = {
  142. .OnPublishSuccess = PublishSuc,
  143. .OnPublishFail = PublishFailed,
  144. };
  145. //将当前的publishId维护进pkgName关系中,方便后期管理
  146. // addPublishIdToPkgName(pkgNameStr, info.publishId);
  147. //发布服务
  148. ret = PublishService(pkgNameStr, &info, &cb);
  149. (*env)->ReleaseStringUTFChars(env, pkgName, pkgNameStr);
  150. return ret;
  151. }
  152. /**
  153. * 停止发布
  154. */
  155. JNIEXPORT jint JNICALL Java_com_jg_softbus_naservice_PublishService_unPublishService
  156. (JNIEnv *env, jobject obj, jstring pkgName, jint publishId) {
  157. const char *pkgNameStr = (*env)->GetStringUTFChars(env, pkgName, NULL);
  158. int ret = UnPublishService(pkgNameStr, publishId);
  159. if (ret != 0) {
  160. // 尝试进行一些可能会抛出异常的操作
  161. jclass exceptionClass = (*env)->FindClass(env, "java/lang/Exception"); // 获取异常类
  162. // 如果找不到异常类,则抛出异常
  163. jmethodID exceptionConstructor = (*env)->GetMethodID(env, exceptionClass, "<init>", "()V");
  164. jthrowable exception = (*env)->NewObject(env, exceptionClass, exceptionConstructor);
  165. // 抛出异常
  166. (*env)->ThrowNew(env, exceptionClass, "stop publish failed!");
  167. printf("UnPublishService fail:%d\n", ret);
  168. }
  169. (*env)->ReleaseStringUTFChars(env, pkgName, pkgNameStr);
  170. (*env)->DeleteGlobalRef(env, globalRef);
  171. }
  172. /**
  173. * publishLNN回调方法
  174. */
  175. void PublishResultHandle(int publishId, PublishResult reason) {
  176. // 获取JNIEnv环境
  177. JNIEnv *env;
  178. // 将当前线程附加到Java虚拟机
  179. (*jvm)->AttachCurrentThread(jvm, (void **)&env, NULL);
  180. // 获取当前对象的类引用
  181. jclass nativeLibClass = (*env)->GetObjectClass(env, globalRef);
  182. // 获取当前对象的publishSuccess方法的ID
  183. jmethodID callbackMethod = (*env)->GetMethodID(env, nativeLibClass, "onPublishResult", "(II)V");
  184. // 调用当前对象的非静态方法
  185. (*env)->CallVoidMethod(env, globalRef, callbackMethod, publishId, (int)reason);
  186. // 将当前线程从Java虚拟机分离
  187. (*jvm)->DetachCurrentThread(jvm);
  188. printf("<PublishFailed>CB: publish %d failed, reason=%d\n", publishId, (int)reason);
  189. }
  190. JNIEXPORT jint JNICALL Java_com_jg_softbus_naservice_PublishService_publishLNN
  191. (JNIEnv *env, jobject obj, jstring pkgName, jobject publishInfo, jobject callback) {
  192. // 保存Java虚拟机的引用
  193. (*env)->GetJavaVM(env, &jvm);
  194. globalRef = (*env)->NewGlobalRef(env, callback);
  195. //包名处理
  196. const char *pkgNameStr = (*env)->GetStringUTFChars(env, pkgName, NULL);
  197. PublishInfo info;
  198. int ret = ParsePublishInfo(env, publishInfo, &info);
  199. if(ret != 0) {
  200. // 尝试进行一些可能会抛出异常的操作
  201. jclass exceptionClass = (*env)->FindClass(env, "java/lang/Exception"); // 获取异常类
  202. // 如果找不到异常类,则抛出异常
  203. jmethodID exceptionConstructor = (*env)->GetMethodID(env, exceptionClass, "<init>", "()V");
  204. jthrowable exception = (*env)->NewObject(env, exceptionClass, exceptionConstructor);
  205. // 抛出异常
  206. (*env)->ThrowNew(env, exceptionClass, "PublishInfo object error.");
  207. //解析失败无法继续操作
  208. return -1;
  209. }
  210. IPublishCb cb = {
  211. .OnPublishResult = PublishResultHandle,
  212. };
  213. //将当前的publishId维护进pkgName关系中,方便后期管理
  214. // addPublishIdToPkgName(pkgNameStr, info.publishId);
  215. //发布服务
  216. ret = PublishLNN(pkgNameStr, &info, &cb);
  217. (*env)->ReleaseStringUTFChars(env, pkgName, pkgNameStr);
  218. return ret;
  219. }
  220. JNIEXPORT jint JNICALL Java_com_jg_softbus_naservice_PublishService_stopPublishLNN
  221. (JNIEnv *env, jobject obj, jstring pkgName, jint publishId) {
  222. const char *pkgNameStr = (*env)->GetStringUTFChars(env, pkgName, NULL);
  223. int ret = StopPublishLNN(pkgNameStr, publishId);
  224. if (ret != 0) {
  225. // 尝试进行一些可能会抛出异常的操作
  226. jclass exceptionClass = (*env)->FindClass(env, "java/lang/Exception"); // 获取异常类
  227. // 如果找不到异常类,则抛出异常
  228. jmethodID exceptionConstructor = (*env)->GetMethodID(env, exceptionClass, "<init>", "()V");
  229. jthrowable exception = (*env)->NewObject(env, exceptionClass, exceptionConstructor);
  230. // 抛出异常
  231. (*env)->ThrowNew(env, exceptionClass, "stop publish failed!");
  232. printf("StopPublishLNN fail:%d\n", ret);
  233. }
  234. (*env)->ReleaseStringUTFChars(env, pkgName, pkgNameStr);
  235. (*env)->DeleteGlobalRef(env, globalRef);
  236. }
  237. JNIEXPORT void JNICALL Java_com_jg_softbus_naservice_PublishService_destroy
  238. (JNIEnv *env, jobject obj) {
  239. // 删除全局引用
  240. (*env)->DeleteGlobalRef(env, globalRef);
  241. free(jvm);
  242. }