在使用unidbg时,会遇到以下区分。开发安卓应用写c++代码时,
什么是jni函数,第一个参数的类型是jniEnv的函数。因为java与jni函数交互时,第一个参数会传入jniEnv,第二个参数会传入jclass 或者jobject。
什么是so函数,函数参数第一个参数不是jniEnv的函数就是so函数。jniOnload函数除外。
函数的开头很多是以下样式:
extern "C"
JNIEXPORT jint JNICALL
//JNIEXPORT是必须的,去掉它重新编译、运行,结果闪退了。相当于export,JNICALL并不需要,去掉extern “C” , 重新生成so,运行app所以,如果希望编译后的函数名不变,应通知编译器使用C的编译方式编译该函数(即:加上关键字:extern “C”)。 // //扩展: //如果即想去掉关键字 extern “C”,又希望方法能被正常调用,真的不能实现吗?extern "C"只是针对函数名 // //非也,还是有解决办法的:“函数的动态注册”,这个后面再介绍吧!! // attribute___((visibility ("default"))) 描述的是“可见性”属性 visibility // //1、default :表示外部可见,类似于public修饰符 (即:可以被外部调用) //2、hidden :表示隐藏,类似于private修饰符 (即:只能被内部调用) #define JNIEXPORT __attribute__ ((visibility ("default"))),所以JNIEXPORT 就是外部可见的意思。没有这个东西就是外部不可见,自然也就无法调用,导致报错闪退。
cmakelists.txt
add_definitions(-fvisibility=hidden) //设置源文件中符号的缺省可见性,设置为default时,没有显式标识为hidden的符号都处理为可见;设置为hidden时,没有显式标识为可见(defalut,即有JNIEXPORT)的符号都处理为隐藏,对于接口函数,可以在函数声明前添加__attribute__ ((visibility ("default"))),使其符号被单独导出.这将向编译器添加 -fvisibility=hidden 选项,使得所有未明确指定可见性的函数和变量的可见性被设置为隐藏。
————————————————
版权声明:本文为CSDN博主「沉迷WebRTC」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Swallow_he/article/details/110938522
ADD_DEFINITIONS 是一个预处理指令,用于向编译器添加编译定义。它通常用于在编译时定义宏或常量。 ADD_DEFINITIONS 指令的语法如下:ADD_DEFINITIONS(-D定义的宏名=定义的宏值)
其中,-D
是用于定义宏的选项,后面跟着宏名和等号,然后是宏的值。这些定义将在预处理阶段被替换为实际的宏值。 以下是一个示例:ADD_DEFINITIONS(-DDEBUG=1)
上述代码将在预处理阶段将DEBUG
定义为1
。这样,在代码中,我们可以通过#ifdef DEBUG
和#endif
来判断是否定义了DEBUG
,从而进行调试。 需要注意的是,ADD_DEFINITIONS 指令应该在 CMakeLists.txt 文件中使用,而不是在源代码文件中使用。 ollvm:
pass