有没有办法在 android JNI 中与 Java 立即共享原生 C 变量?
我想在客户端接收来自C层的数据,因为服务器是用C++编写的(涉及结构读写),并将数据到来的情况记录在一个数组变量中,并想在Java中检测该变量并做什么`s 对应,想知道这是否可能?
我考虑过将有关数据传入情况的文件写入 sdcard,但这是我最不想做的事情,有什么提示吗?
最佳答案
我最近遇到了这个问题,可以解决。我有一个 C++ Qt Android 项目需要执行一些 java 代码(对于只能从 Android SDK 访问的东西)。为此,我必须在我的 Java 和 C++ 代码之间共享一些常量(让它们一起交谈并相互理解)。
以下是实现此目标的可能解决方案:
- 让 C++ 在创建时将常量值传递给 Java 对象(或者如果 Java 调用 C++,则采用这种方法)。但如果你有很多变量,那就很痛苦了。
- 有一个由 C++ 和 Java 模块动态解析的配置文件。应该可以,但没有尝试。
- 在两个地方声明变量....糟糕的想法并且难以维护
- 有一个由 C++ 和 Java 直接使用(“包含”)的声明文件
我终于完成了最后一个解决方案。这个想法是让 C++ 和 Java 都使用一个 java 文件(这种方法可能有效,但我更喜欢 C++,所以这种方式对我来说看起来更容易)。并且我们使用预处理器使此 java 文件有效以作为头文件被 C++ 包含!
这是声明常量(整数和字符串)的 Java 文件 (constants.java) 的示例:
package name1.name2.name3;
import java.lang.String;
class MyConstants
{
public static String THE_NAME() { return "Name"; }
public static Integer THE_VALUE() { return 12; }
};
这可以在任何 Java 代码中毫无问题地用于访问变量。 现在,这是从 C++ 文件中包含它的方法:
#include <string>
using namespace std;
#define public public:
#define package struct mockup1 { int name3; };struct mockup2 { mockup1 name2; };int i1 =
#define name1 mockup2()
#define import struct mockup3 { int String; };struct mockup4 { mockup3 lang; };int i2 =
#define java mockup4()
#define String string
#define Integer int
#include "constants.java"
#undef public
#undef String
#undef package
#undef import
#undef java
#undef name3
预处理器然后将 constants.java 文件更改为这个有效的 C++ 头文件(主要的困难是摆脱包和导入行,因为你不能在宏名称中使用点......必须是恶意的):
struct mockup1 { int name3; };struct mockup2 { mockup1 name2; };int i1 = mockup2().name2.name3;
struct mockup3 { int String; };struct mockup4 { mockup3 lang; };int i2 = mockup4().lang.String;
class MyConstants
{
public: static string THE_NAME() { return "Name"; }
public: static int THE_VALUE() { return 12; }
};
这里是 C++ 中的常量!
int main()
{
cout << MyConstants::THE_NAME() << MyConstants::THE_VALUE() << endl;
return 0;
}
关于android - 如何在 Android JNI 中的 Java 和 C 之间共享一个变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8430924/