我的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”,那么我可以发现没问题。所以问题似乎是签名??
答案 0 :(得分:1)
我使用javap找到答案。
javap可以在结果类中使用,如下所示:
javap -s -p MainActivity
这会生成输出.class文件的签名列表(不是.java源文件!)。我找到了签名:
Lcom/example/gt/ContextActivity;
..现在工作正常。 : - )