JNI-java和c互通

1javac是如何互通的?

  其实不能互通的原因主要是数据类型的问题,jni解决了这个问题,例如那个c文件中的jstring数据类型就是java传入的String对象,经过jni函数的转化就能成为cchar*

  对应数据类型关系如下表:

  Java 类型 本地c类型 说明 boolean jboolean 无符号,8 byte jbyte 无符号,8 char jchar 无符号,16 short jshort 有符号,16 int jint 有符号,32 long jlong 有符号,64 float jfloat 32 double jdouble 64 void void。

2. 如何将java传入的String参数转换为cchar*,然后使用?

    java传入的String参数,在c文件中被jni转换为jstring的数据类型,在c文件中声明char* test,然后test = (char*)(env)->GetStringUTFChars(jstring, NULL);

     char* buff,把char类型的buf传回去,jstring result = env->NewStringUTF(buff);

     注意:test使用完后,通知虚拟机平台相关代码无需再访问:env->ReleaseStringUTFChars( jstring, test);

3、条件编译

#ifdef __cplusplus (其中__cplusplus是cpp中自定义的一个宏!!!用G++编译器编译这个宏才会有定义)

extern "C"{  //告诉编译器,这部分代码按C语言的格式进行编译,而不是C++的

#endif

//代码部分

#ifdef __cplusplus

}

#endif

     由于C++支持函数重载,而C语言不支持,因此函数被C++编译后在符号库中的名字是与C语言不同的;C++编译后的函数需要加上参数的类型才能唯一标定重载后的函数,而加上extern "C"后,是为了向编译器指明这段代码按照C语言的方式进行编译

     extern "C"不加{}是怎么使用的??加在某个函数前面或某句代码前面

    C语言不支持extern "C"语法,如果我们想写一个头文件,同时支持被CC++引用,该怎么办?可以使用C++的宏 "__cplusplus"来判断是不是C++编译器。

猜你喜欢

转载自blog.csdn.net/TSZ0000/article/details/82754065