Как разделить переменную между Java и C в Android JNI? - PullRequest
4 голосов
/ 08 декабря 2011

Есть ли способ мгновенного совместного использования собственной переменной C с Java в Android JNI?

Я хочу получать данные из уровня C в клиенте, поскольку сервер написан на C ++ (с использованием структуры чтения / записи)и записать ситуацию с поступлением данных в переменную массива, и хочу обнаружить эту переменную в Java и сделать то, что соответствует, задаваясь вопросом, возможно ли это?

Я подумывал написать файл о ситуации с поступлением данныхв SDCard, однако, что последнее, что я хочу сделать, какие-либо советы?

Ответы [ 2 ]

1 голос
/ 30 июля 2014

У меня недавно была эта проблема, и я мог ее решить.У меня есть 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;
}
0 голосов
/ 10 июля 2013

Я не сделал ни одного андроида - так что возьмите это с крошкой соли - но вы, вероятно, могли бы использовать прямой байтовый буфер.Проблема будет состоять в том, чтобы знать, что что-то случилось.Вы можете просто опрашивать буфер, но это было бы не намного лучше, чем просто использовать JNI для опроса значения.

В обычной java люди могут воспользоваться для этого классом sun.misc.Unsafe, еслиони были готовы пойти на риск.Я не уверен, существует ли этот класс в Android, но, возможно, это поможет Небезопасный класс в Android? .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...