1、native方法签名生成
编写jni经常写一些jni方法签名是很枯燥,而且经常用错,熟悉语法固然是好事,但有时候可以通过命令解决问题。
使用javah生成头文件,一般的方式为
javah -jni com.zippo.ffmpegplayer.MainActivity
方式生成。
执行和这个命令的时候出现了这个错误。
错误: 无法确定SurfaceView的签名
原因是引入了SurfaceView,这个是android的代码,需要引入android的jar包
其命令应为:javah -classpath ${ANDROID.jar}:. -jni ${CLASS}
类似:javah -classpath /Users/zippo/Library/Android/sdk/platforms/android-23/android.jar:. -jni com.zippo.ffmpegplayer.MainActivity
2、普通方法签名获取
上述方法主要是针对调用native方法的签名生成,并不能生成普通的java方法的签名,由于我们在jni开发中难免会使用native方法调用java方法的情况,所以还需要通过命令来获取普通java方法的签名。
方法如下:
-(1)、找到需要签名的java方法的class文件目录
一般在'{modulename}/build/javac/{buildType}/packagename/x.class'
-(2)、在该目录下执行命令
javap -s -p MainActivity.class
,就能在console得到该类的全部签名,desciption就是该签名
然后就可以通过callTypeMethod来调用了。
extern "C"
JNIEXPORT jint JNICALL
Java_com_github_zippozeng_jnidemo_MainActivity_nativeCallJava(JNIEnv *env, jobject thiz) {
jclass clazz = env->GetObjectClass(thiz);
jmethodID methodId = env->GetMethodID(clazz, "setTextViewByNative", "(Ljava/lang/String;)V");
if (methodId == 0) {
return -1;
}
jstring param = env->NewStringUTF("C中调用Java的String参数方法");
env->CallVoidMethod(thiz, methodId, param);
env->DeleteLocalRef(clazz);
// env->DeleteLocalRef(methodId);
env->DeleteLocalRef(param);
return 1;
}
网友评论