jni生成方法签名

2019-10-21  本文已影响0人  zippozeng

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;
}
上一篇 下一篇

猜你喜欢

热点阅读