JNI: преобразование функции C в функцию стиля Java - PullRequest
2 голосов
/ 06 июня 2011

Фон

Я работаю с функциями, которые передают аргументы как указатели. Мне нужно преобразовать функцию, написанную в C в JAVA с тем же поведением, что и в C . Я разрабатываю для Android в Eclipse в Windows .

C Пример функции

int testFunction( char* firstName, char* SecomdName, char* lastname, int age);

Эта функция принимает 3 указателя на char значений и инициализирует их, поэтому в C я могу написать что-то вроде следующего инициализировать все три указателя:

char* v1, v2, v3;
int res = testFunction(v1, v2, v3, 54);

После вызова testFunction переменные v1, v2, v3 будут инициализированы с некоторыми значениями.

Пример функции JAVA

int testFunction( String firstName, String secondName, String lastName, int age);

Это та же функция, что и в C , но записана в JAVA , однако в JAVA нет указателей, что означает, что я не могу написать что-то вроде этого:

String v1, v2, v3;
testFunction(v1, v2, v3, 54);

Вопрос:

Что я могу сделать, чтобы получить то же поведение при инициализации для моей функции JAVA, что и в примере C? Возможно ли это?

Ответы [ 4 ]

3 голосов
/ 06 июня 2011

Есть несколько вещей, которые вы могли бы сделать. Вы можете создать класс компонента, который содержит поля, которые вы хотите создать, например что-то вроде:

 public class Names {
     String firstName;
     String secondName;
     String lastName;
     int returnValue;

     // getters/constructors etc ommitted...
 }

Ваша функция testFunction может затем создать экземпляр объекта Names и вернуть его, т. Е.

 Names names = testFunction(int age);
 String firstName = names.getFirstName();
 // etc... 

Альтернативой, если вы имеете дело со строками, является прохождение через объекты StringBuilder, т.е.

int testFunction(StringBuilder firstName, StringBuilder secondName, StringBuilder lastName, int age) {
   // Use StringBuilder methods such as append to create the strings eg...
   firstName.append("Bob");
}

Тогда в другом месте вашего кода вы можете использовать ...

StringBuilder firstNameBuilder = new StringBuilder();
StringBuilder secondNameBuilder = new StringBuilder();
StringBuilder thirdNameBuilder = new StringBuilder();

testFunction(firstNameBuilder, secondNameBuilder, thirdNameBuilder, 84);

String firstName = firstNameBuilder.toString();  // firstName now equals "Bob"
/// etc...
2 голосов
/ 06 июня 2011

Вы должны сделать что-то вроде этого:

public class Person {
    public String firstName;
    public String secondName;
    public String lastName;
}

int testFunction(Person person, int age) {
    ...
    // fill person fields
}

Person person = new Person();
int res = testFunction(person, 54);
2 голосов
/ 06 июня 2011

Вы должны применить шаблон «Держатель».Грубо говоря (сейчас я не могу протестировать код, но вы поймете, что), вы можете сделать что-то вроде этого:

class Holder <T>
{
  public T element;
  public T value() { return element; }
  public void setValue(T t ) { element = t; }
}

, а затем изменить код, чтобы принимать Holder<String> элементов.У вас есть недостаток в необходимости вызывать value() (или получить внутренний element), но это более простой и простой способ, который приходит мне в голову (он также используется в отображении Java для IDL в CORBA для удержания ""ссылки").

Теперь вы можете сделать что-то вроде:

Holder<String> name = new Holder<String>();

int result = testFunction(name, ...);
System.out.println(name.value());

, и реализация testFunction является простой:

int testFunction(Holder<String> name, ...)
{
   name.setValue("whatever");
   // ...
}
1 голос
/ 06 июня 2011

Вы можете сделать так, чтобы ваш testFunction(...) возвратил Объект, который содержит три (char примитивы / String Objects).

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