以前一直用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
|