微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

有没有办法在 Android JNI中使用Java立即共享本机C变量?

我想从客户端的C层接收数据,因为服务器是用C语言编写的(包含结构读/写),并在数组变量中记录数据即将发生的情况,并想在Java中检测该变量并执行相应的操作,想知道这是否可能?

我考虑将关于数据即将出现的情况的文件写入sdcard,但是我想做的最后一件事,任何提示

解决方法

我最近有这个问题,可以解决它.我有一个C Qt Android项目需要执行一些java代码(只能从Android SDK访问).为了实现这一点,我必须在我的java和C代码之间共享一些常量(让它们一起交谈并相互理解).

以下是实现此目的的可能解决方案:

>在创建时让C将常量值传递给Java对象(或者如果Java调用C,则将其传递给Java对象).但是如果你有很多变数那就很难过了.
>让C和Java模块动态解析配置文件.应该工作,但没有尝试.
>在两个地方声明变量……糟糕的想法和难以维护
> C和Java都有一个直接使用的声明文件(‘included’)

我终于做了最后的解决方案.我的想法是让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;
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐