Я просто возился с учебником по 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; однако мне нужно иметь возможность вызывать метод из другого пакета ... это возможно?