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