【问题标题】:Android JNI GetStaticFieldID failsAndroid JNI GetStaticFieldID 失败
【发布时间】:2014-06-25 03:35:47
【问题描述】:

我有一个 MainActivity 定义如下:

public class MainActivity extends Activity
{
  public static ContextActivity   g_ContextActivity;

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

java.lang.NoSuchFieldError: 类 Lcom/example/gt/MainActivity 中没有 name='g_ContextActivity' signature='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 添加一个“静态 int”,那么我可以发现它没有问题。所以问题似乎出在签名上??

【问题讨论】:

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


    【解决方案1】:

    我使用 javap 找到了答案。

    javap 可用于生成的类,如下所示:

    javap -s -p MainActivity
    

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

    Lcom/example/gt/ContextActivity;
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多