jni关于内部类的一些问题

    初次接触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"


  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值