Сбой Android JNI GetStaticFieldID

#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;
  

.. и теперь он работает нормально. 🙂