У меня недавно была эта проблема, и я мог ее решить.У меня есть C ++ Qt проект Android, который должен выполнить некоторый Java-код (для вещей, доступных только из Android SDK).Чтобы достичь этого, мне пришлось разделить некоторые константы между моим кодом Java и C ++ (чтобы они общались и понимали друг друга).
Вот возможные решения для достижения этой цели:
- Пусть C ++ передаст значения констант объекту Java при создании (или наоборот, если Java вызывает C ++).Но если у вас много переменных, это будет просто.
- Файл конфигурации динамически анализируется модулями C ++ и Java.Должен работать, но не пробовал.
- Объявлять переменные в обоих местах .... плохая идея и трудно поддерживать
- Иметь файл объявления, непосредственно используемый («включенный») обоими C ++и Java
Я наконец заставил работать последнее решение.Идея состоит в том, чтобы использовать Java-файл как в C ++, так и в 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;
}