从C++访问安卓上的GPS

Access GPS on Android from C++

本文关键字:GPS C++ 访问      更新时间:2023-10-16

我有一个Android应用程序,它充当一个小守护程序(用C++编写)的GUI,需要在各种移动/嵌入式Linux设备上运行。 守护程序需要收集 GPS 数据并将其传递给多个客户端(安卓手机,每个客户端都有一个 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/implementing/index.html)以及其他一些网站上阅读了它。 但是我突然想到,我还没有看到任何使用具有main()功能的JNI的C代码。 此外,JNI_CreateJavaVM()函数在我的 NDK 工具链的jni.h头文件中被注释掉了。 事实上,我首先无法弄清楚如何拥有有效的JNIEnv*。 我得出的结论是,JNI代码应该由需要C支持的Java应用程序使用,而不是需要Java支持的C应用程序。 这是对的吗?

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

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

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

感谢您的阅读。

我建议您尝试使用此代码:使用libhardware的Android GPS。

这个小项目使用 AOSP 的 libhardware 库。有关如何使用 GPS 抽象接口的详细信息,请参阅 gps.h。也值得一看 GpsLocationProvider.java 和 com_android_server_location_GpsLocationProvider.cpp.