C/C++&java communicate with each other 之 video file-streaming

使用开源通信框架alljoyn来做设备,服务的搜索、发现,通信,详细原理参考

https://allseenalliance.org/developers/learn/core/system-description/advertisement-discovery

gstreamer作媒体播放。

有兴趣同学可以看下https://github.com/europelee/AjUtil,简单的多媒体文件流分享(上图即它的architecture)

(alljoyn设备、服务通告,发现示意图)

涉及面:

1. JNI中的多native线程与java通信处理:

JNIEnv, java_vm, thread: JNIEnv不能为多个native线程共同拥有, 即JNIEnv对于每个线程是唯一的,它是线程相关的,那么

对于一个native线程如果需要使用JNIEnv, 需要通过javavm的AttachCurrentThread方法来获取它自有的。

比如下面的 set_ui_message,当内部native线程运行时需要通知某些消息到android 的java层 , 通过get_jni_env来获取它自有JNIEnv.

2.Thread-Specific Data

大家注意到current_jni_env? 如果 set_ui_message在多个native线程里面被调用,那get_jni_env函数里面pthread_getspecific搞什么鬼,

current_jni_env就一个全局变量,能保证每个线程的env指针唯一?

正常情况下,一个全局变量是为进程内的多个线程共享,但如果线程想单独拥有它,那么可以使用POSIX提供的Thread-Specific Data, 即

线程私有数据,这样看起来这是一个全局变量,所有线程都可以使用它,但它的值在每一个线程中又是单独存储的,一个使用同名而不同变量地址的线程相关数据结构,通过pthread_key_create函数来创建 

pthread_key_create(&current_jni_env, detach_current_thread);

 

3. code:

/* Register this thread with the VM */

static JNIEnv *attach_current_thread(void) {

JNIEnv *env;

JavaVMAttachArgs args;

GST_DEBUG("Attaching thread %p", g_thread_self());

args.version = JNI_VERSION_1_4;

args.name = NULL;

args.group = NULL;

if ((*java_vm)->AttachCurrentThread(java_vm, &env, &args) < 0) {

GST_ERROR("Failed to attach current thread");

return NULL;

}

return env;

}

/* Retrieve the JNI environment for this thread */

static JNIEnv *get_jni_env(void) {

JNIEnv *env;

if ((env = pthread_getspecific(current_jni_env)) == NULL) {

env = attach_current_thread();

pthread_setspecific(current_jni_env, env);

}

return env;

}

/* Change the content of the UI‘s TextView */

static void set_ui_message(const gchar *message, CustomData *data) {

JNIEnv *env = get_jni_env();

GST_DEBUG("Setting message to: %s", message);

jstring jmessage = (*env)->NewStringUTF(env, message);

(*env)->CallVoidMethod(env, data->app, set_message_method_id, jmessage);

if ((*env)->ExceptionCheck(env)) {

GST_ERROR("Failed to call Java method");

(*env)->ExceptionClear(env);

}

(*env)->DeleteLocalRef(env, jmessage);

}

时间: 2024-11-04 07:31:59

C/C++&java communicate with each other 之 video file-streaming的相关文章

C/C++&amp;java communicate with each other 之 video snapshot

场景: android应用层间隔1秒调用底层driver上C API,获取到framebuffer, 提供给android layer业务分析. TvVideoRecord 主要功能 1. 申请一个ByteBuffer对象frameBuffer 2. 将frameBuffer传给底层c接口jni_getFrameBuffer,  该函数会将TV画面帧填充进去 3. 最后调用接口ITVCaptureVideoListener onSuccess方法,将frameBuffer传给应用层的TvCapt

黑马程序员——Java I/O流基础知识点(File类)

File工具 File类就是用俩将文件或者文件夹封装对象,弥补流对象的不足--流只能操作数据,不能操作文件夹的 封装的是路径!!! 构造方法演示 1.可以将已有的未出现的文件或者文件夹封装成对象. File f1=new File("c:\\abc\\a.txt"): File f2=new File("d:\\abc","ab.txt"打印,会打印路径.:目录分隔符,为了更好地跨平台File. File类常见功能 1,创建 createNewF

java基础知识回顾之javaIO类--File类应用:获取指定目录下面的指定扩展名的文件,将文件的绝对路径写入到目的文件当中

/** * File文件综合应用 * 需求:获取指定目录下面,指定扩展名的文件,将文件的绝对路径写到文本文件当中. *  * 思路:1.需要深度遍历.--递归 * 2.遍历的过程中过滤指定扩展名的文件--过滤器FileNameFilter,将文件存入容器中 * 3.将容器中的内容遍历,写入到指定文件中 * */ 代码:  FilenameFilter 过滤器: package com.lp.ecjtu.File.filter; import java.io.File; import java.i

java基础知识回顾之javaIO类--File类应用:删除带内容的目录

/** * 深度删除一个带内容的目录 * 原理:必须从里往外删除,需要深度遍历 * @author Administrator * */ public class FileDeleteList { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub File dir = new File("E:\\复件 demodir"); removedir(

java基础知识回顾之javaIO类--File类应用:递归深度遍历文件

代码如下: package com.lp.ecjtu.File.FileDeepList; import java.io.File; public class FileDeepList { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub File dir = new File("E:"+File.separator+"demodir

java基础知识回顾之javaIO类--File类应用:过滤器接口FilenameFilter和FileFilter

FilenameFilter和FileFilter都是用来过滤文件,例如过滤,以.jpg或者.java结尾的文件,通过看他们的源码:通过使用File类中String[] list(FilenameFilter filter)或者public File[] listFiles(FileFilter filter)方法,把FilenameFilter或者FileFilter接口对象作为参数传入,通过实现接口里面的 boolean accept(File dir, String name) 或者boo

java基础知识回顾之javaIO类--File类

File类是对文件系统中文件以及目录(文件夹)进行封装的对象,可以通过面向对象的思想来操作文件和目录(文件夹).File类保存文件或目录的各种元素的信息,包括文件名,文件长度,最后修改日期,是否可读,获取当前文件的路径名,判断指定文件是否存在,获得当前文件的列表,创建.删除文件目录等方法. /**     * 构造方法:File f = new File("file.txt");//file.txt 相对路径     *       File f1 = new File("c

解决Warning Couldn&#39;t flush user prefs: java.util.prefs.BackingStoreException: Couldn&#39;t get file lock.

系统:Ubuntu 16.04 LTS 环境:vscode+java extension pack打开了一个gradle的java项目:另外,用一个terminal启动了groovysh 报错: groovysh报错 java.util.prefs.FileSystemPreferences syncWorld警告: Couldn't flush user prefs: java.util.prefs.BackingStoreException: Couldn't get file lock.

[Java开发之路](6)File类的使用

1. 构造方法 构造方法 描写叙述 File(String pathname) 通过将给定的路径名字符串转换为抽象路径名来创建一个新的文件实例. File(String parent , String child) 通过给定的父路径名字符串和子路径名字符串来创建一个新的文件实例. File(File parent , String child) 通过给定的父抽象路径对象和子路径名字符串来创建一个新的文件实例. File(URI uri) 通过给定的URI来创建一个新的文件实例 package c