Android - вызов собственной функции JNI из другого пакета - PullRequest
0 голосов
/ 24 марта 2012

Я просто возился с учебником по Ndk, который нашел. Нативный код использует один «пакет», а активность - в другом. Когда происходит это несоответствие, я не могу вызвать нативную функцию, не получив исключение неудовлетворенной ссылки. Я знаю «почему», я просто не знаю резолюции.

Вот пример кода .c, который я поместил в мою папку jni:

#include <string.h>
#include <jni.h>

jstring Java_com_mindtherobot_samples_ndkfoo_NdkFooActivity_invokeNativeFunction(JNIEnv* env, jobject javaThis) {
  return (*env)->NewStringUTF(env, "Hello from native code!");
}

Обратите внимание, что пакет этого кода .c переводится как com.mindtherobot.samples.ndkfoo.NdkFooActivity.

Если я создаю новое действие, которое соответствует этому Пакету / Классу, я могу назвать invokeNativeFunction очень хорошо. Однако, что, если я не могу соответствовать этому? Что если вместо этого мне нужно запустить его из com.mydomain.activity?

Я подумал, что мог бы что-то изменить, чтобы моя нативная декларация выглядела так:

package com.mydomain;

public class Activity {
    private native String com_mindtherobot_samples_ndkfoo_NdkFooActivity_invokeNativeFunction();
}

Но это не пойдет. Просто чтобы быть ясно, я знаю, как заставить это работать, если я изменю свой пакет, чтобы соответствовать тому, что скомпилировано в коде .c; однако мне нужно иметь возможность вызывать метод из другого пакета ... это возможно?

Ответы [ 2 ]

2 голосов
/ 24 марта 2012

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

0 голосов
/ 25 марта 2012

Ваш вопрос довольно зашифрован, но объявление пакета в исходном коде Java должно совпадать с тем, что закодировано в собственном имени метода, то есть оно должно совпадать с тем, что генерируется javah. Если вы измените пакет в коде Java, вы должны заново сгенерировать файл .h и настроить файл .c в соответствии с вашими требованиями. Нет другого способа обойти это.

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