#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. По-прежнему не удается протестировать его должным образом, но я сообщу здесь, если кто-нибудь столкнется с подобной проблемой.