android jni型別和引數簽名
阿新 • • 發佈:2019-01-25
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
package com.victor.hello; import java.io.Serializable; public class People implements Serializable { public int age; public String name; public int getAge() { return age下面看下一個引數的set方法和get方法:; } 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; } publicPeople 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); }