我正在为使用 GStreamer 0.10.36 的嵌入式系统开发软件。我的目标是使软件在闪存空间方面尽可能小,因此我想静态链接我需要的 GStreamer 插件。根据核心参考手册:
“有一些选项可以将插件静态链接到应用程序,甚至可以在没有插件存储库的情况下使用 GStreamer,在这种情况下,可能需要 gst_plugin_load() 将插件加载到内存中。”
不幸的是,我不清楚需要做什么才能将插件放入内存以便后续调用gst_element_factory_make()成功完成。
我正在执行以下操作:
--enable-static使用和设置构建 GStreamer --disable-registry。gst_element_factory_make()创建元素现在我只对多个插件中的一个(tcpclientsink)进行此操作作为实验。我必须编辑该插件的 Makefile 以删除一条--disable-static语句来构建 libgsttcp.a 文件。我认为这个库很好,但我不确定是否有一个好的方法来验证这一点。 gst-inspect似乎不适用于静态库。
注意:如果我调用load_gst_plugin(/path/to/libgsttcp.a),GStreamer 由于 ELF 标头无效而无法加载插件。
如何加载静态链接的 GStreamer 库?
我想编写一个应用程序来为 Linux 系统生成键盘输入(即对于系统来说,它看起来就像按下了键盘上的按钮)。我想使用 C,但 xdotools 不是一个选择。Libevdev 看起来很有前途,但到目前为止我还没能让它发挥作用。
首先,libevdev可以做我想做的事吗?大多数文档都集中于读取传入的输入并将其输出,但 API 确实具有“通过 uinput 设备发布事件”的功能。
还有一个创建设备的示例。我将示例修改如下:
#include <stdio.h>
#include <libevdev.h>
#include <libevdev-uinput.h>
int main(int argc, char **argv)
{
int err;
struct libevdev *dev;
struct libevdev_uinput *uidev;
dev = libevdev_new();
libevdev_set_name(dev, "fake keyboard device");
libevdev_enable_event_type(dev, EV_KEY);
libevdev_enable_event_code(dev, EV_KEY, KEY_A, NULL);
err = libevdev_uinput_create_from_device(dev,
LIBEVDEV_UINPUT_OPEN_MANAGED,
&uidev);
if (err != 0)
return err;
libevdev_uinput_write_event(uidev, EV_KEY, KEY_A, 1);
libevdev_uinput_write_event(uidev, EV_SYN, SYN_REPORT, 0);
libevdev_uinput_write_event(uidev, EV_KEY, KEY_A, 0);
libevdev_uinput_write_event(uidev, EV_SYN, SYN_REPORT, 0);
libevdev_uinput_destroy(uidev);
printf("Complete\n");
}
Run Code Online (Sandbox Code Playgroud)
当我运行此应用程序时,我没有看到任何错误(为简洁起见,从上面的代码中删除了错误处理),但我也没有看到按下“A”键。我是否做错了什么或者我对这个库有错误的期望?
我有两个设备,我想通过串行接口连接,但它们有不兼容的连接.为了解决这个问题,我将它们连接到我的PC上,我正在开发一个C#程序,它将把COM端口X上的流量路由到COM端口Y,反之亦然.
该程序连接到两个COM端口.在数据接收事件处理程序中,我读入传入的数据并将其写入另一个COM端口.为此,我有以下代码:
private void HandleDataReceived(SerialPort inPort, SerialPort outPort)
{
byte[] data = new byte[1];
while (inPort.BytesToRead > 0)
{
// Read the data
data[0] = (byte)inPort.ReadByte();
// Write the data
if (outPort.IsOpen)
{
outPort.Write(data, 0, 1);
}
}
}
Run Code Online (Sandbox Code Playgroud)
只要传出的COM端口以高于传入COM端口的波特率运行,该代码就能正常工作.如果传入的COM端口比传出的COM端口快,我开始丢失数据.我不得不纠正这样的代码:
private void HandleDataReceived(SerialPort inPort, SerialPort outPort)
{
byte[] data = new byte[1];
while (inPort.BytesToRead > 0)
{
// Read the data
data[0] = (byte)inPort.ReadByte();
// Write the data
if (outPort.IsOpen)
{
outPort.Write(data, 0, 1);
while (outPort.BytesToWrite > 0); //<-- Change …Run Code Online (Sandbox Code Playgroud) 我正在尝试启动一项服务,但我一直在 logcat 输出中看到以下消息,这让我怀疑事情是否真的有效:
W/ContextImpl( 1506): Calling a method in the system process without a qualified user:
android.app.ContextImpl.startService:1479
android.content.ContextWrapper.startService:494
myapp.startService:765
myapp.onStart:386 a
ndroid.app.Instrumentation.callActivityOnStart:1171
Run Code Online (Sandbox Code Playgroud)
我的应用程序是平台构建的一部分并安装在系统目录中。现在我有这个活动的代码(从 onStart 启动服务):
public class MyAppNotification extends Activity {
@Override
protected void onStart() {
super.onStart();
...
MyAppService.startService(MyAppNotification.this);
}
}
Run Code Online (Sandbox Code Playgroud)
该服务然后提供此功能:
public class MyAppService extends Service {
...
public static void startService(Context context) {
Intent intent = new Intent(context, MyAppService.class);
context.startService(intent);
}
}
Run Code Online (Sandbox Code Playgroud)
我会提到之前该服务是由广播接收器启动的,但我想切换到手动启动它。
最后,这是一个没有正确处理上下文的问题吗?
我一直在使用以下命令在Android源代码的几个分支之间切换:
repo init -u https://android.googlesource.com/platform/manifest -b android-4.4_r1.2
repo sync
Run Code Online (Sandbox Code Playgroud)
最近的标签是android-5.0.0_r2.我注意到我的.repo目录现在大小为30 GB.那是预期的大小吗?如果没有,那么我猜测我的历史来自我在.repo目录中存储的其他分支/标签.
有没有办法减少.repo目录的大小?我想限制只有源/对象/图像/等.我需要我正在研究的特定分支.硬盘空间对我来说比下载时间更重要.
我看到git gc用于.git存储库,但在这种情况下不起作用.是否存在等效的.repo存储库?
注意:我确实尝试过repo prune,但这并没有减小.repo目录的大小.
我正在使用OpenEmbedded用户手册中的“ Hello World”示例以及Yocto Project工具的Dora版本。bitbake构建工作正常,但是未在映像中安装可执行文件。基本上,我用两个配方创建了自己的meta层。一种是Autotools版本的“ Hello World”,它将自身构建并安装到映像中。第二个是“ Hello World”的Makefile版本。这就是我遇到的麻烦。
来源是您所期望的:
#include <stdio.h>
int main(int argc, char** argv)
{
printf("Hello world 2!\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
还有一个README.txt文件:
Readme file for Hello World 2.
Run Code Online (Sandbox Code Playgroud)
配方如下:
DESCRIPTION = "Hello World 2 Program"
PR = "r0"
LICENSE = "CLOSED"
RM_WORK_EXCLUDE += "hello2"
SRC_URI = "file://hello2.c \
file://README.txt"
do_compile() {
${CC} ${CFLAGS} ${LDFLAGS} ${WORKDIR}/hello2.c -o hello2
}
do_install() {
install -m 0755 -d ${D}${bindir} ${D}${docdir}/hello2
install -m 0644 ${S}/hello2 ${D}${bindir}
install -m 0644 ${WORKDIR}/README.txt ${D}${docdir}/hello2 …Run Code Online (Sandbox Code Playgroud) 我正在重写一些代码以兼容32位和64位架构,而且我遇到了vsnprintf调用问题.似乎vsnprintf在任一架构上都没有正确处理inttypes.h中的固定大小整数类型.
这是相关代码:
void formatString(char *buffer, int size, char *format, ...)
{
va_list va;
/* Format the data */
va_start( va, format );
vsnprintf( (char *)buffer, size, format, va );
va_end( va );
}
int main(int argc, char *argv[])
{
char buffer[2048];
printf("The format string: %s\n", stringsLookup(0));
formatString(&buffer[0], sizeof(buffer), stringsLookup(0), 1, 2);
printf("The output string: %s\n", buffer);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出如下:
The format string: action=DoSomething&Val1=%"PRIx32"&Val2=%x
The output string: action=DoSomething&Val1=%"PRIx32"&Val2=1
Run Code Online (Sandbox Code Playgroud)
您可以看到格式字符串的%"PRIx32"部分未按预期替换为值"1".这是一个已知的问题?有工作吗?
我将提到如果我在源代码中对字符串进行硬编码,则预处理器似乎将"%PRIu32"转换为适用于体系结构的宏,并且对vsnprintf的调用也起作用.不幸的是我需要能够加载字符串.
更新
一些额外的背景:当我从32位系统移动到64位系统时,我不得不修复某些变量的大小.我宣称它们是uint32_t.我还更改了打印它们的位置以清理编译器警告.使用上一个代码printf("%lx").我用过printf("%"PRIx32).我需要做一些类似于对vsnprintf的调用.
正如我所提到的,如果我在源代码中硬编码字符串,预处理器似乎将"%"PRIx32恰当地转换为"%lx"或"%x".不幸的是,当我必须从文件中加载字符串时,我遇到了麻烦.预处理器无法帮助我.