android JNI 之 Log

浏览: 29 发布日期: 2017-07-05 分类: android

使用ndk开发jni时,Java类中的本地方法名不能有下划线,有下划线时函数映射会出现错误

昨天写的Log程序运行起来就崩溃,检查log信息,发现问题出在本地方法中,但一直不明白是怎么回事,开始以为是编译的问题。

之前写了一个JNI的测试程序,那个可以运行,于是对比分析了一下,发现只有本地方法的参数类型不一致,测试程序的参数都是int型,log程序是String,于是把log程序的参数也改成int型,结果运行正常。

原来在JNI中输出log的方法__android_log_print(ANDROID_LOG_DEBUG, tag, msg);的参数是char*,直接传jstring会报错,对比Log源码,发现JNIEnv中的GetStringUTFChars函数能够把jstring转成char*,用转型后的char*数据就不会崩溃,当然使用GetStringUTFChars后,在char*数据用完后要调用ReleaseStringUTFChars方法释放资源。

JVM加载库文件后,会调用库中的JNI_OnLoad方法,如果没写这个方法,会在Log信息中提示:No JNI_OnLoad found in......

java中的方法到jni中的方法有一个映射过程,映射方法有两种,可以叫静态和动态。

静态方法是java中的方法到jni中的方法用一种严格的方式映射,最终结果是jni中的方法名必须按照特定的格式来写,不然找不到方法。

动态方法是在上述的JNI_OnLoad方法中动态的向JVM注册jni方法和java方法的关联,这样做jni中的方法名可以随意。

以上就是android JNI 之 Log的全文介绍,希望对您学习Android应用开发有所帮助.
返回顶部