android - 如何在 Android JNI 中的 Java 和 C 之间共享一个变量?

标签 android variables java-native-interface share

有没有办法在 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/

相关文章:

Android:应用程序构建和安装

android - windows 上的 Ant build 文件我到底把 {sdk.dir} 定义放在哪里?

android - 如何在android中以编程方式从通知栏中删除通知?

java - 暂停通过 JNI 运行的 native C 代码

java - 通过 JNI 内部调用 JVM 函数

java - 在使用 va_arg 传递 char* 时,在 JNI 中将 char* 转换为 jstring

android - 如何在用户离开当前 Activity 时执行一些代码(按下硬件按钮)

c - c中的变量隐藏和 "priority"

c++ - 通过 vector 更改对象变量的值

variables - $0 中的 awk gsub 也更改变量