2019独角兽企业重金招聘Python工程师标准>>>
先看一段jni自动生成的源代码:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class TestJni */
#ifndef _Included_TestJni
#define _Included_TestJni
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: TestJni
* Method: sayHello
* Signature: (Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_TestJni_sayHello
(JNIEnv *, jobject, jstring);
//--kill-at
#ifdef __cplusplus
}
#endif
#endif
extern "C"
初次看有些陌生,首先我们先要明白 为何要使用extern"C",在c++中为了支持重载机制,在编译生成的代码中要对函数的名字进行处理,例如加入函数的返回类型等.而c中只是简单的函数名而已,不会加入其它东西.试想如果已经有一个c的函数库供我们c++调用,那么就会找不到函数,因为c++中我们的方法名称已经不再是原来的名字,因此我们需要使用extern"C"告诉编译器使用c的方式来连接他们.那么上面出现的结果就是
如果__cplusplus定义了结果为
extern "C" {
/*
* Class: TestJni
* Method: sayHello
* Signature: (Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_TestJni_sayHello
(JNIEnv *, jobject, jstring);
//--kill-at
}
如果没有定义则
/*
* Class: TestJni
* Method: sayHello
* Signature: (Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_TestJni_sayHello
(JNIEnv *, jobject, jstring);
转载于:https://my.oschina.net/zorigin/blog/133935
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)