Как передать параметры между файлами JNI и DLL, реализованными в C ++ - PullRequest
1 голос
/ 16 апреля 2011

следующий код объявлен в JAVA

private native static Vector< Double > computeSimXML(Vector < String > vDocsPath);

Я хочу передать параметр vDocsPath (определенный как Vector ) в C ++, код, сгенерированный JNI, выглядит следующим образом: (Я реализовалнекоторые)

/*
 * Class:     SimXMLModule
 * Method:    computeSimXML
 * Signature: (Ljava/util/Vector;)Ljava/util/Vector;
 */
JNIEXPORT jobject JNICALL Java_SimXMLModule_computeSimXML
  (JNIEnv *, jclass, jobject)
{
   vector<double>  dist;

   dist.push_back(5.0);
   dist.push_back(6.0);

}

Как я могу получить значение от vDocsPath до jobject и вернуть dist (определенный как Vector< Double > в JAVA) в JAVA?

1 Ответ

5 голосов
/ 16 апреля 2011

Это не очень хорошая функция для запуска с JNI - для ее правильной реализации потребуется определенная работа.

  • Параметр Vector<String> представляет собой обычную не универсальную среду выполнения Vector.
  • Возвращаемое значение Vector<Double> представляет собой простое неуниверсальное Vector время выполнения
  • Вам необходимо получить идентификаторы классов и методов, а также вызвать Vector функции для получения данных из параметра.
  • Вам необходимо создать серию из Double объектов, установить внутренние double и вызвать Vector методы для установки возвращаемого значения.

Я бы порекомендовал вамизменил сигнатуру функции на:

private native static double[] computeSimXML(String[] vDocsPath);

Интерфейс JNI для работы с массивами на много проще, чем вы пытаетесь сделать.Вы можете перебирать параметры с помощью GetArrayLength и GetObjectArrayElement, а также создавать и манипулировать возвращаемым значением с помощью NewDoubleArray, GetArrayElements и ReleaseArrayElements

...