转载请注明本文出自文韬_武略的博客(http://blog.csdn.net/fwt336/article/details/59540356),请尊重他人的辛勤劳动成果,谢谢!
jni中的签名参数是一个很麻烦的东西,稍不注意,应用就gg了。
1.基本类型
另外:typedef jint jsize;
2.引用类型
3.成员变量描述符
4.方法描述符
5.参数签名.基本格式
(参数1类型标示;参数2类型标示;...参数n类型标示)返回值类型标示。
再来看一个小例子,如表1-2所示:上面列出了一些常用的类型标示。请读者注意,如果Java类型是数组,则标示中会有一个“[”,另外,引用类型(除基本类型的数组外)的标示最后都有一个“;”。
表1-2 函数签名小例子
函数签名 | Java函数 |
“()Ljava/lang/String;” | String f() |
“(ILjava/lang/Class;)J” | long f(int i, Class c) |
“([B)V” | void f(byte[] bytes) |
6.Demo
下面看下一个参数的set方法和get方法:package com.victor.hello; import java.io.Serializable; public class People implements Serializable { public int age; public String name; public int getAge() { return age; } public void setNameAndAge(String name, int age) { this.name = name; this.age = age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public People getInstance() { return this; } }
JNIEXPORT jint JNICALL Java_com_victor_hello_HelloWorld_getPeopleToStr (JNIEnv *env, jobject clazz, jobject peopleObj) { //先找到com/victor/hello/People类在JNI层中对应的jclass实例。 jclass peopleInterface = env->FindClass("com/victor/hello/People"); jmethodID setAgeMethodID = env->GetMethodID(peopleInterface, "setAge", "(I)V"); env->CallIntMethod(peopleObj, setAgeMethodID, 110); jmethodID getAgeMethodID = env->GetMethodID(peopleInterface, "getAge", "()I"); jint age = env->CallIntMethod(peopleObj, getAgeMethodID); return age; }
最后调用方法:
getPeopleToStr(new People());
返回:110
多个参数的调用:
JNIEXPORT void JNICALL Java_com_victor_hello_HelloWorld_setPeopleParams (JNIEnv *env, jobject clazz, jobject clientObj, jstring name, jint age) { jclass peopleInterface = env->FindClass("com/victor/hello/People"); jmethodID setAgeMethodID = env->GetMethodID(peopleInterface, "setNameAndAge", "(Ljava/lang/String;I)V"); env->CallIntMethod(clientObj, setAgeMethodID, name, age); }