1. 程式人生 > >android jni型別和引數簽名

android jni型別和引數簽名


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
; } 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; } }
下面看下一個引數的set方法和get方法:
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);
}