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