android jni类型和参数签名

转载请注明本文出自文韬_武略的博客(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

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);
}



  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值