jni关于内部类的一些问题

来源:互联网 发布:java网络编程视频教程 编辑:程序博客网 时间:2024/06/11 08:46

    初次接触JNI,本来对java也不熟,因为要做android的项目,碰到了一些问题,特此记录

java代码如下:

class A{

    static{

        System.loadLibrary("A");

    }

    int a = 1;

   class B{

        int b = 2;

        public void show(){

            System.out.println("b = " + b);

        }

    };

    public native B getB();

    public void show(){

        System.out.println("a = " + a);

        getB().show();

    }

};

如上代码,A有一个内部类B,如果要在JNI层返回B的实例,首先用 javap -s -p A.B 查看签名得到

A$B(A);
  Signature: (LA;)V

说明B的构造函数带有一个参数类A

c代码如下:

JNIEXPORT jobject JNICALL Java_A_getB(JNIEnv *env, jobject thiz)
{
        jobject b = NULL;
        jclass bcls = (*env)->FindClass(env,"A$B");
        jmethodID mid = (*env)->GetMethodID(env,bcls,"<init>","(LA;)V");
        b = (*env)->NewObject(env,bcls,mid,thiz);
        return b;
}


注意上面的红色代码,因为B是A的内部类,所以FindClass的时候是A$B

然后是B的构造方法,因为是构造方法,所以GetMethodID的第三个参数固定为"<init>",第四个参数,对于一般类来说为"()V",

因为B是A的内部类,通过上面的javap查看得到此处应该为"(LA;)V"


原创粉丝点击