以前一直用jni,可是沒有考慮Java重載函數,如何在jni-C++裏命名,今天看到一篇文章,講到了類型簽名。html
原文連接:http://www.2cto.com/kf/201405/302263.htmljava
咱們知道,利用javah生成的c/c++頭文件的時候,會對java中定義的 native 函數生成對應的jni層函數,以下:c++
1
2
3
4
5
6
7
|
/*
* Class: com_lms_jni_JniTest
* Method: getTestString
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_lms_jni_JniTest_getTestString
(JNIEnv *, jobject);
|
對於傳統的JNI編程來講,JNI方法跟Java類方法的名稱之間有必定的對應關係,要遵循必定的命名規則,以下:
編程
1
|
public
native
String addTail(String tail);
|
1
|
jstring Java_com_lms_jni_HwDemo_addTail(JNIEnv * e, jobject clazz, jstring tail);
|
java | jni |
char | jchar |
byte | jbyte |
short | jshort |
int | jint |
long | jlong |
float | jfloat |
double | jdouble |
boolean | jboolean |
1
2
3
4
5
6
7
8
9
10
11
|
typedef union jvalue {
jboolean z;
jbyte b;
jchar c;
jshort s;
jint i;
jlong j;
jfloat f;
jdouble d;
jobject l;
} jvalue;
|
Java 類型 | 類型簽名 |
boolean | Z |
byte | B |
char | C |
short | S |
int | I |
long | L |
float | F |
double | D |
類 | L全限定名;,好比String, 其簽名爲Ljava/lang/util/String; |
數組 | [類型簽名, 好比 [B |
1
|
public
string addTail(String tail,
int
index)
|
1
|
(Ljava/util/String;I)Ljava/util/String;
|
1
|
public
int
addValue(
int
index, String value,
int
[] arr)
|
1
|
(ILjava/util/String;[I)I
|