我最近有这个问题,可以解决它.我有一个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
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;
}