jni string 转换
        【摘要】  参考: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
返回字符串:
  
   - 
    
     
    
    
      string result="aaaaa";
     
    
 
   - 
    
     
    
    
      char *p = const_cast<char*>(result.c_str());
     
    
 
   - 
    
     
    
    
     
       jstring jres = env->NewStringUTF(p);
     
    
 
   - 
    
     
    
    
      return jres;
     
    
 
  
 
string转换
  
   - 
    
     
    
    
     
      #include <jni.h>
     
    
 
   - 
    
     
    
    
      
     
    
 
   - 
    
     
    
    
     
      #include <android/log.h>
     
    
 
   - 
    
     
    
    
     
      #include <liveMedia.hh>
     
    
 
   - 
    
     
    
    
     
      #include <BasicUsageEnvironment.hh>
     
    
 
   - 
    
     
    
    
     
      #include <GroupsockHelper.hh>
     
    
 
   - 
    
     
    
    
     
      #include <pthread.h>
     
    
 
   - 
    
     
    
    
     
      #include "DynamicRTSPServer.hh"
     
    
 
   - 
    
     
    
    
     
      #include "version.hh"
     
    
 
   - 
    
     
    
    
     
      #include "RTSPStream.h"
     
    
 
   - 
    
     
    
    
     
      #include "H264VideoSource.h"
     
    
 
   - 
    
     
    
    
     
      #include "H264VideoServerMediaSubsession.h"
     
    
 
   - 
    
     
    
    
      
     
    
 
   - 
    
     
    
    
     
      #ifdef __cplusplus
     
    
 
   - 
    
     
    
    
     
      extern "C" {
     
    
 
   - 
    
     
    
    
     
      #endif
     
    
 
   - 
    
     
    
    
      
     
    
 
   - 
    
     
    
    
     
      #define LOG_TAG "streamer"
     
    
 
   - 
    
     
    
    
     
      #define LOGW(a )  __android_log_write(ANDROID_LOG_WARN,LOG_TAG,a)
     
    
 
   - 
    
     
    
    
     
      #define LOGI(...)  __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)
     
    
 
   - 
    
     
    
    
     
      #define LOGD(...)  __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
     
    
 
   - 
    
     
    
    
     
      #define LOGE(...)  __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)
     
    
 
   - 
    
     
    
    
     
      void play();
     
    
 
   - 
    
     
    
    
     
      void afterPlaying(void* /*clientData*/);
     
    
 
   - 
    
     
    
    
     
      //}
     
    
 
   - 
    
     
    
    
      
     
    
 
   - 
    
     
    
    
     
      UsageEnvironment* uEnv;
     
    
 
   - 
    
     
    
    
     
      H264VideoStreamFramer* videoSource;
     
    
 
   - 
    
     
    
    
     
      RTPSink* videoSink;
     
    
 
   - 
    
     
    
    
     
      char quit;
     
    
 
   - 
    
     
    
    
     
      char* url;
     
    
 
   - 
    
     
    
    
     
      int port_number;
     
    
 
   - 
    
     
    
    
     
      FILE *file;
     
    
 
   - 
    
     
    
    
     
      char const *inputFilename;
     
    
 
   - 
    
     
    
    
     
      Boolean reuseFirstSource  = False;
     
    
 
   - 
    
     
    
    
     
      Boolean reuseFirstSource0 = True;
     
    
 
   - 
    
     
    
    
     
      pthread_mutex_t   mutex;
     
    
 
   - 
    
     
    
    
      
     
    
 
   - 
    
     
    
    
     
      //将const char类型转换成jstring类型
     
    
 
   - 
    
     
    
    
     
      jstring CStr2Jstring0(JNIEnv* env, const char* pat )
     
    
 
   - 
    
     
    
    
     
      {
     
    
 
   - 
    
     
    
    
     
          // 定义java String类 strClass
     
    
 
   - 
    
     
    
    
     
          jclass strClass = (env)->FindClass("java/lang/String;");
     
    
 
   - 
    
     
    
    
     
          // 获取java String类方法String(byte[],String)的构造器,用于将本地byte[]数组转换为一个新String
     
    
 
   - 
    
     
    
    
     
          jmethodID ctorID = (env)->GetMethodID(strClass, "<init>", "([BLjava/lang/String;)V");
     
    
 
   - 
    
     
    
    
     
          // 建立byte数组
     
    
 
   - 
    
     
    
    
     
          jbyteArray bytes = (env)->NewByteArray((jsize)strlen(pat));
     
    
 
   - 
    
     
    
    
     
          // 将char* 转换为byte数组
     
    
 
   - 
    
     
    
    
     
          (env)->SetByteArrayRegion(bytes, 0, (jsize)strlen(pat), (jbyte*)pat);
     
    
 
   - 
    
     
    
    
     
          //设置String, 保存语言类型,用于byte数组转换至String时的参数
     
    
 
   - 
    
     
    
    
     
          jstring encoding = (env)->NewStringUTF("GB2312");
     
    
 
   - 
    
     
    
    
     
          //将byte数组转换为java String,并输出
     
    
 
   - 
    
     
    
    
     
          return (jstring)(env)->NewObject(strClass, ctorID, bytes, encoding);
     
    
 
   - 
    
     
    
    
      
     
    
 
   - 
    
     
    
    
     
      }
     
    
 
   - 
    
     
    
    
     
      char * Jstring2CStr0( JNIEnv * env, jstring jstr )
     
    
 
   - 
    
     
    
    
     
      {
     
    
 
   - 
    
     
    
    
     
          char * rtn = NULL;
     
    
 
   - 
    
     
    
    
     
          jclass clsstring = env->FindClass("java/lang/String");
     
    
 
   - 
    
     
    
    
     
          jstring strencode = env->NewStringUTF("GB2312");
     
    
 
   - 
    
     
    
    
     
          jmethodID mid = env->GetMethodID(clsstring, "getBytes", "(Ljava/lang/String;)[B");
     
    
 
   - 
    
     
    
    
     
          jbyteArray barr= (jbyteArray)env->CallObjectMethod(jstr,mid,strencode);
     
    
 
   - 
    
     
    
    
     
          jsize alen = env->GetArrayLength(barr);
     
    
 
   - 
    
     
    
    
     
          jbyte * ba = env->GetByteArrayElements(barr,JNI_FALSE);
     
    
 
   - 
    
     
    
    
     
          if(alen > 0)
     
    
 
   - 
    
     
    
    
     
          {
     
    
 
   - 
    
     
    
    
     
              rtn = (char*)malloc(alen+1); //new char[alen+1];
     
    
 
   - 
    
     
    
    
     
              memcpy(rtn,ba,alen);
     
    
 
   - 
    
     
    
    
     
              rtn[alen]=0;
     
    
 
   - 
    
     
    
    
     
          }
     
    
 
   - 
    
     
    
    
     
          env->ReleaseByteArrayElements(barr,ba,0);
     
    
 
   - 
    
     
    
    
      
     
    
 
   - 
    
     
    
    
     
          return rtn;
     
    
 
   - 
    
     
    
    
     
      }
     
    
 
   - 
    
     
    
    
      
     
    
 
   - 
    
     
    
    
     
      jstring CharTojstring0(JNIEnv* env, char* str)
     
    
 
   - 
    
     
    
    
     
      {
     
    
 
   - 
    
     
    
    
     
          jsize len = strlen(str);
     
    
 
   - 
    
     
    
    
     
          jclass  clsstring = env->FindClass("java/lang/String");
     
    
 
   - 
    
     
    
    
     
          jstring  strencode = env->NewStringUTF("GB2312");
     
    
 
   - 
    
     
    
    
     
          jmethodID  mid = env->GetMethodID(clsstring,"<init>","([BLjava/lang/String;)V");
     
    
 
   - 
    
     
    
    
     
          jbyteArray  barr = env-> NewByteArray(len);
     
    
 
   - 
    
     
    
    
     
          env-> SetByteArrayRegion(barr,0,len,(jbyte*)str);
     
    
 
   - 
    
     
    
    
     
          return (jstring)env-> NewObject(clsstring,mid,barr,strencode);
     
    
 
   - 
    
     
    
    
     
      }
     
    
 
   - 
    
     
    
    
      
     
    
 
   - 
    
     
    
    
     
      void doExecuteVideoViewShow0(JNIEnv * env, jobject obj, jstring sdp) {
     
    
 
   - 
    
     
    
    
     
          // 1.找到java的MainActivity的class
     
    
 
   - 
    
     
    
    
     
          jclass clazz = env->FindClass("com/example/mylive55servermediacodec2/StreamerActivity2");
     
    
 
   - 
    
     
    
    
     
          if (clazz == 0) {
     
    
 
   - 
    
     
    
    
     
              LOGI("can't find clazz");
     
    
 
   - 
    
     
    
    
     
          }
     
    
 
   - 
    
     
    
    
     
          LOGI(" find clazz");
     
    
 
   - 
    
     
    
    
      
     
    
 
   - 
    
     
    
    
     
          //2 找到class 里面的方法定义
     
    
 
   - 
    
     
    
    
     
          jmethodID methodid = env->GetMethodID(clazz, "PlayRtspStream", "(Ljava/lang/String;)V");
     
    
 
   - 
    
     
    
    
     
          if (methodid == 0) {
     
    
 
   - 
    
     
    
    
     
              LOGI("can't find methodid");
     
    
 
   - 
    
     
    
    
     
          }
     
    
 
   - 
    
     
    
    
     
          LOGI(" find methodid");
     
    
 
   - 
    
     
    
    
      
     
    
 
   - 
    
     
    
    
     
          //3 .调用方法
     
    
 
   - 
    
     
    
    
     
          env->CallVoidMethod(clazz, methodid, sdp);
     
    
 
   - 
    
     
    
    
     
      }
     
    
 
   - 
    
     
    
    
      
     
    
 
   - 
    
     
    
    
     
      static void announceStream0(RTSPServer* rtspServer, ServerMediaSession* sms,
     
    
 
   - 
    
     
    
    
     
              char const* streamName, char const* inputFileName)
     
    
 
   - 
    
     
    
    
     
      {
     
    
 
   - 
    
     
    
    
     
          char* url = rtspServer->rtspURL(sms);
     
    
 
   - 
    
     
    
    
     
          char buf[255] = { 0 };
     
    
 
   - 
    
     
    
    
     
          UsageEnvironment& env = rtspServer->envir();
     
    
 
   - 
    
     
    
    
     
          sprintf(buf,
     
    
 
   - 
    
     
    
    
     
                  "%s-->stream, from the file-->%s,Play this stream using the URL:%s",
     
    
 
   - 
    
     
    
    
     
                  streamName, inputFileName, url);
     
    
 
   - 
    
     
    
    
     
          LOGW(buf);
     
    
 
   - 
    
     
    
    
     
          delete[] url;
     
    
 
   - 
    
     
    
    
     
      }
     
    
 
  
 
文章来源: blog.csdn.net,作者:网奇,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/jacke121/article/details/72911460
        【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
            cloudbbs@huaweicloud.com
        
        
        
        
        
        
        - 点赞
 - 收藏
 - 关注作者
 
            
           
评论(0)