上次记录了一下如何调用java代码,但是java方法有静态与非静态之分,所以调用方式也是不一样的。
java代码:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final JNI jni = new JNI();
final int[] arr = {1,2,3,4,5};
((Button) findViewById(R.id.bt_fuck)).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
jni.cinovkejavashow();
}
});
}
public static void show(){
Log.i("mydata","呵呵,我静态方法被调用了");
}
}
public class JNI {
/**
* 加载动态链接库
* 也就是c代码编译好的so文件
*/
static {
System.loadLibrary("app");
}
public native void cinovkejavashow();
}
C代码:
/*
* Class: com_example_jnidemo_JNI
* Method: cinovkejavashow
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_example_jnidemo_JNI_cinovkejavashow (JNIEnv *env, jobject obj){
//通过反射获取到类
jclass jclazz = (*env)->FindClass(env,"com/example/jnidemo/MainActivity");
//通过反射获取到方法
/**
* 第一个参数:虚拟机指针
* 第二个参数:方法所在class
* 第三个参数:方法名
* 第四个参数:方法签名(javap -s class全类名(字节码的全类名))
*/
jmethodID jmethod = (*env)->GetStaticMethodID(env,jclazz,"show","()V");
//调用方法
/**
* 第一个参数:java虚拟机
* 第二个参数:调用此方法的类
* 第三个参数:jmethodID
*/
(*env)->CallStaticVoidMethod(env,jclazz,jmethod);
}
重点一:和Java反射调用一样,调用静态方法的话,就不需要实例,直接class.方法名就可以了。
重点二:jni语法中都有对应的获取static方法的相关函数,注意与非静态调用之间的区别。