#android #android-ndk #java-native-interface #static-members
#Android #android-ndk #java-родной интерфейс #статические члены
Вопрос:
У меня есть MainActivity, определенный как показано ниже:
public class MainActivity extends Activity
{
public static ContextActivity g_ContextActivity;
В моем JNI OnLoad() Я успешно получаю ссылку на свой класс MainActivity, но не могу получить ссылку на статический элемент g_ContextActivity. Я получаю сообщение об ошибке:
java.lang.Ошибка NoSuchFieldError: нет статического поля с именем= ‘g_ContextActivity’ signature=’com/example/gt/ContextActivity’ в классе Lcom/example/gt/MainActivity;
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *javaVm, void *reserved)
{
g_JavaVM = javaVm;
JNIEnv *pEnv = NULL;
if( g_JavaVM->GetEnv( (void **)amp;pEnv, JNI_VERSION_1_6) != JNI_OK )
{
return -1;
}
jclass clsMainActivity = pEnv->FindClass( "com/example/gt/MainActivity" );
LogDebugf( "PDS> (ONLOAD) clsMainActivity: lxn", (long) clsMainActivity );
if( JNIException( pEnv ) )
return -1;
if( g_MainActivityClass )
pEnv->DeleteGlobalRef( g_MainActivityClass );
g_MainActivityClass = (jclass) pEnv->NewGlobalRef( clsMainActivity );
jfieldID fidContextActivity = pEnv->GetStaticFieldID( g_MainActivityClass, "g_ContextActivity", "com/example/gt/ContextActivity" );
if( JNIException( pEnv ) )
return -1;
LogDebugf( "PDS> (ONLOAD) g_ContextActivity ID: lxn", (long) fidContextActivity );
Что я делаю не так?
РЕДАКТИРОВАТЬ: если я добавлю «static int» в MainActivity, я смогу найти его без проблем. Итак, проблема, по-видимому, связана с подписью??
Ответ №1:
Я нашел ответ, используя javap.
javap можно использовать в результирующем классе следующим образом:
javap -s -p MainActivity
При этом создается список подписей для выходных файлов .class (не .исходный файл java!). Я нашел подпись:
Lcom/example/gt/ContextActivity;
.. и теперь он работает нормально. 🙂