小编rex*_*oni的帖子

从C++访问Android上的GPS

我有一个Android应用程序,用作一个需要在各种移动/嵌入式Linux设备上运行的小守护程序(用C++编写)的GUI.守护进程需要收集GPS数据并将其传递给多个客户端(Android手机,每个客户端都有一个GUI).守护进程需要能够在用作GUI的相同Android设备之一上运行,但是我在从C++守护进程访问GPS数据时遇到了很多麻烦.

到目前为止,我已经研究了两个选项:

1)"保留原生"方法:我听说gpsd存在于Android(例如http://esr.ibiblio.org/?p=4886),但我的三星似乎难以捉摸和/或不存在Galaxy SII,运行Cyanogenmod 10.1.3-i9100(Android 4.2.2).我从NDK构建的独立工具链似乎没有任何与gps相关的东西,即使像这样的网站(http://www.jayway.com/2010/01/25/boosting-android-performance-using- -jni /)表示java使用JNI包装器来使用C代码与GPS进行通信.

2)jni方法:GPS在Android Java应用程序中看起来非常简单,所以我开始研究JNI(顺便说一句,我对Android和Java都是新手).它应该被证明是C代码和Java代码交互的一种方式,对吧?我在这个网站(http://journals.ecs.soton.ac.uk/java/tutorial/native1.1/implementing/index.html)和本网站(http://journals.ecs.soton)上阅读了它..ac.uk/java/tutorial/native1.1/implementation/index.html)和其他一些人.但它发生在我身上我没有看到任何使用具有main()函数的JNI的C代码.此外,该JNI_CreateJavaVM()功能在jni.h我的NDK工具链的头文件中被注释掉.事实上,我无法弄清楚如何JNIEnv*在第一时间有效.我得出的结论是,JNI代码旨在由需要C支持的Java应用程序使用,而不是需要Java支持的C应用程序.那是对的吗?

然后我有第三个想法,我不太喜欢:

3)"备份"方法:在Android手机上运行C++守护程序的情况下,也许它可以向android GUI询问GPS数据,然后将其广播给其他客户端?我想他们可能通过套接字或简单的东西进行通信.这似乎是一个非常难看的解决方案,因为除了看似效率低下之外,守护进程应该能够独立于任何GUI运行,但现在它将取决于GPS数据的GUI.

所以我真正的问题是,有没有其他人遇到这个问题并找到了合适的答案?或者也许有些东西我不了解Android中的某些东西,或者关于Android中的JNI?

谢谢阅读.

c++ java-native-interface gps android

9
推荐指数
1
解决办法
5576
查看次数

在写入管道期间,SIGINT信号被丢弃

我有一个程序,使用pcap_dump函数将使用libpcap收集的pcap数据转储到stdout,使用stdout作为FILE*.在SIGINT上需要进行一些清理,所以我用sigaction()处理它.从shell执行时,这很好用.

但是,该程序旨在由另一个程序调用,这似乎不起作用.这个"调用者"程序调用一个pipe(),然后调用一个fork(),然后关闭子节点的stdout文件描述符,并替换为管道的写端.最后,在子进程中执行上述pcap程序.这样pcap数据就会通过管道写入调用者程序.这也很好用.但是,当我在写入管道时向子进程发送SIGINT(好吧,pcap程序认为它写入stdout,但其文件描述符已更改),信号似乎被丢弃,并且信号处理函数永远不会被召唤.

这是为什么?如果我将pcap数据写入stderr或文件,SIGINT永远不会被删除.只有在写入管道时.

以下是我们如何设置管道/ fork/execute:

int fd[2];

//Create pipe
pipe(fd);

pid = fork(); //We forked a child

if(pid == 0){ //We are the child now

    close(1); //close child's stdout

    dup(fd[1]); //duplicate child's stdout to the write end of the pipe

    close( fd[0]); //close unused file descriptors
    close( fd[1]);

    //Load the new program
    execlp("./collectraw", "collectraw", NULL);

    perror("Exec");
    exit(127); //Should never get called but we leave it so the child
    //doesnt accidently keep executing
}
else{ //We are the parent

    //Set up …
Run Code Online (Sandbox Code Playgroud)

c++ signals pipe

6
推荐指数
1
解决办法
512
查看次数

标签 统计

c++ ×2

android ×1

gps ×1

java-native-interface ×1

pipe ×1

signals ×1