Помещение примитивных типов JNI в один и тот же массив

#java #android #object #casting #java-native-interface

#java #Android #объект #Кастинг #java-native-interface

Вопрос:

Я пытаюсь написать статический метод Java, который с заданными параметрами выполняет поиск и вызывает метод.

Предполагается, что этот метод должен иметь переменное количество аргументов и должен вызываться из C . Я попробовал несколько вариантов, но я не могу это сделать. Возможно ли это вообще?

Пока я могу хранить, какие типы он содержит и в какой позиции, и я могу поместить jobject и jstring в один и тот же массив.

Если это невозможно, можно ли ссылаться на methodID, найденный из JNI, с отражением Java или каким-либо образом передавать ссылку на объект в long. Такая структура была бы в порядке, поскольку я могу использовать 64-битное целое число для всего остального.

Комментарии:

1. Я думаю, что это может быть возможно с информацией о типе во время выполнения .

2. Я думаю, что RTTI отключен в Android native, не уверен.

3. Пожалуйста, отредактируйте свой вопрос, чтобы указать android!

Ответ №1:

Если вам нужен этот массив в JNI, используйте тип объединения jvalue в качестве типа массива. Пример: jvalue myArray* = { (jint) 1, (jlong) 1000, (jboolean) false }

Java не поддерживает jvalue и не поддерживает переменные функции, поэтому, если вам нужно передать этот массив примитивов в JNI из Java как способ обойти ограничение, вы должны использовать массив объектов с примитивными объектными оболочками, такими как java.lang.Целочисленные и вызывающие функции значений в зависимости от типа в JNI. Это возможно, просто сложно реализовать.

Комментарии:

1. Какова была бы сложность такого количества вызовов для одного выполнения? И нормально ли инициировать все эти объекты?

2. Это не будет слишком медленно, и почему бы этому не быть в порядке? Головная боль, реализующая его в JNI, заключается просто в итерации массива, а затем в вызове isInstanceOf, за которым следует поиск по некоторым классам и методам. После нахождения идентификатора метода для чего-то вроде objInteger.intValue(), вы должны вызвать этот метод, чтобы получить желаемый jprimitive .

3. Спасибо, у меня есть определенный способ сделать это. Я храню эти 9 классов как глобальные ссылки и там конструкторы methodID и использую object array. По-прежнему не удается протестировать его должным образом, но я сообщу здесь, если кто-нибудь столкнется с подобной проблемой.