Android JNI GetStaticFieldID失败

时间:2014-06-25 03:35:48

标签: android android-ndk java-native-interface static-members

我的MainActivity定义如下:

public class MainActivity extends Activity
{
  public static ContextActivity   g_ContextActivity;

在我的JNI OnLoad()中,我成功获得了对MainActivity类的引用,但是我无法获得对g_ContextActivity静态成员的引用。我收到错误:

java.lang.NoSuchFieldError:类Lcom / example / gt / MainActivity中没有名称='g_ContextActivity'cignra ='com / example / gt / ContextActivity'的静态字段;

  JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *javaVm, void *reserved)
  {
    g_JavaVM = javaVm;

    JNIEnv *pEnv = NULL;

    if( g_JavaVM->GetEnv( (void **)&pEnv, JNI_VERSION_1_6) != JNI_OK )
    {
      return -1;
    }

    jclass clsMainActivity = pEnv->FindClass( "com/example/gt/MainActivity" );

    LogDebugf( "PDS> (ONLOAD) clsMainActivity: %08lx\n", (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: %08lx\n", (long) fidContextActivity );

我做错了什么?

编辑:如果我向MainActivity添加“static int”,那么我可以发现没问题。所以问题似乎是签名??

1 个答案:

答案 0 :(得分:1)

我使用javap找到答案。

javap可以在结果类中使用,如下所示:

javap -s -p MainActivity

这会生成输出.class文件的签名列表(不是.java源文件!)。我找到了签名:

Lcom/example/gt/ContextActivity;

..现在工作正常。 : - )