jni string 转换

举报
风吹稻花香 发表于 2021/06/05 00:19:31 2021/06/05
【摘要】 参考:https://github.com/wangzuxing/MyFFmpegH264H265YUVOpenGL/blob/master/MyFFmpegH264H265YUVOpenGL/jni/streamer.cpp 返回字符串: string result="aaaaa"; char *p = const_cast<char*>(result.c...

参考:https://github.com/wangzuxing/MyFFmpegH264H265YUVOpenGL/blob/master/MyFFmpegH264H265YUVOpenGL/jni/streamer.cpp

返回字符串:


  
  1. string result="aaaaa";
  2. char *p = const_cast<char*>(result.c_str());
  3. jstring jres = env->NewStringUTF(p);
  4. return jres;

string转换


  
  1. #include <jni.h>
  2. #include <android/log.h>
  3. #include <liveMedia.hh>
  4. #include <BasicUsageEnvironment.hh>
  5. #include <GroupsockHelper.hh>
  6. #include <pthread.h>
  7. #include "DynamicRTSPServer.hh"
  8. #include "version.hh"
  9. #include "RTSPStream.h"
  10. #include "H264VideoSource.h"
  11. #include "H264VideoServerMediaSubsession.h"
  12. #ifdef __cplusplus
  13. extern "C" {
  14. #endif
  15. #define LOG_TAG "streamer"
  16. #define LOGW(a )  __android_log_write(ANDROID_LOG_WARN,LOG_TAG,a)
  17. #define LOGI(...)  __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
  18. #define LOGD(...)  __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
  19. #define LOGE(...)  __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)
  20. void play();
  21. void afterPlaying(void* /*clientData*/);
  22. //}
  23. UsageEnvironment* uEnv;
  24. H264VideoStreamFramer* videoSource;
  25. RTPSink* videoSink;
  26. char quit;
  27. char* url;
  28. int port_number;
  29. FILE *file;
  30. char const *inputFilename;
  31. Boolean reuseFirstSource  = False;
  32. Boolean reuseFirstSource0 = True;
  33. pthread_mutex_t   mutex;
  34. //将const char类型转换成jstring类型
  35. jstring CStr2Jstring0(JNIEnv* env, const char* pat )
  36. {
  37.     // 定义java String类 strClass
  38.     jclass strClass = (env)->FindClass("java/lang/String;");
  39.     // 获取java String类方法String(byte[],String)的构造器,用于将本地byte[]数组转换为一个新String
  40.     jmethodID ctorID = (env)->GetMethodID(strClass, "<init>", "([BLjava/lang/String;)V");
  41.     // 建立byte数组
  42.     jbyteArray bytes = (env)->NewByteArray((jsize)strlen(pat));
  43.     // 将char* 转换为byte数组
  44.     (env)->SetByteArrayRegion(bytes, 0, (jsize)strlen(pat), (jbyte*)pat);
  45.     //设置String, 保存语言类型,用于byte数组转换至String时的参数
  46.     jstring encoding = (env)->NewStringUTF("GB2312");
  47.     //将byte数组转换为java String,并输出
  48.     return (jstring)(env)->NewObject(strClass, ctorID, bytes, encoding);
  49. }
  50. char * Jstring2CStr0( JNIEnv * env, jstring jstr )
  51. {
  52.     char * rtn = NULL;
  53.     jclass clsstring = env->FindClass("java/lang/String");
  54.     jstring strencode = env->NewStringUTF("GB2312");
  55.     jmethodID mid = env->GetMethodID(clsstring, "getBytes", "(Ljava/lang/String;)[B");
  56.     jbyteArray barr= (jbyteArray)env->CallObjectMethod(jstr,mid,strencode);
  57.     jsize alen = env->GetArrayLength(barr);
  58.     jbyte * ba = env->GetByteArrayElements(barr,JNI_FALSE);
  59.     if(alen > 0)
  60.     {
  61.         rtn = (char*)malloc(alen+1); //new char[alen+1];
  62.         memcpy(rtn,ba,alen);
  63.         rtn[alen]=0;
  64.     }
  65.     env->ReleaseByteArrayElements(barr,ba,0);
  66.     return rtn;
  67. }
  68. jstring CharTojstring0(JNIEnv* env, char* str)
  69. {
  70.     jsize len = strlen(str);
  71.     jclass  clsstring = env->FindClass("java/lang/String");
  72.     jstring  strencode = env->NewStringUTF("GB2312");
  73.     jmethodID  mid = env->GetMethodID(clsstring,"<init>","([BLjava/lang/String;)V");
  74.     jbyteArray  barr = env-> NewByteArray(len);
  75.     env-> SetByteArrayRegion(barr,0,len,(jbyte*)str);
  76.     return (jstring)env-> NewObject(clsstring,mid,barr,strencode);
  77. }
  78. void doExecuteVideoViewShow0(JNIEnv * env, jobject obj, jstring sdp) {
  79.     // 1.找到java的MainActivity的class
  80.     jclass clazz = env->FindClass("com/example/mylive55servermediacodec2/StreamerActivity2");
  81.     if (clazz == 0) {
  82.         LOGI("can't find clazz");
  83.     }
  84.     LOGI(" find clazz");
  85.     //2 找到class 里面的方法定义
  86.     jmethodID methodid = env->GetMethodID(clazz, "PlayRtspStream", "(Ljava/lang/String;)V");
  87.     if (methodid == 0) {
  88.         LOGI("can't find methodid");
  89.     }
  90.     LOGI(" find methodid");
  91.     //3 .调用方法
  92.     env->CallVoidMethod(clazz, methodid, sdp);
  93. }
  94. static void announceStream0(RTSPServer* rtspServer, ServerMediaSession* sms,
  95.         char const* streamName, char const* inputFileName)
  96. {
  97.     char* url = rtspServer->rtspURL(sms);
  98.     char buf[255] = { 0 };
  99.     UsageEnvironment& env = rtspServer->envir();
  100.     sprintf(buf,
  101.             "%s-->stream, from the file-->%s,Play this stream using the URL:%s",
  102.             streamName, inputFileName, url);
  103.     LOGW(buf);
  104.     delete[] url;
  105. }

 

文章来源: blog.csdn.net,作者:网奇,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/jacke121/article/details/72911460

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。