jni 中的 extern "C" 分析

先看一段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);



你可能感兴趣的:(jni,extern,"C")