JNI基础学习笔记--基本数据类型的传递与返回

13 篇文章 0 订阅
5 篇文章 0 订阅

基本类型和本地类型对比表:

Java类型本地类型说明
booleanjboolean无符号,8位
bytejbyte无符号,8位
charjchar无符号,16位
shortjshort有符号,16位
intjint有符号,32位
longjlong有符号,64位
floatjfloat32位
doublejdouble 
voidvoidN/A

从上表可以看jni的基本类型还是很容易记住的,所有数据类型都在头文件 jni.h中定义,需要详细了解可以查看这个头文件。

为熟练各个类型的使用,通过一个demo来加强记忆,demo很简单在android 定义各个类型的本地方法,传入相关类型的值,然后从本地方法中返回相应的数据类型值。

本地方法定义类 代码如下:

package com.aidesudi.testjni;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;


public class MainActivity extends AppCompatActivity {



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        boolean b = passBooleanReturnBoolean(true);
        byte b1 = passByteReturnByte((byte) 10);
        char c = passCharReturnChar('#');
        short s = passShortReturnShort((short) 100);
        int i = passIntReturnInt(1000);
        long l = passLongReturnLong(234234242L);
        float f = passFloatReturnFloat(10.0f);
        double d = passDoubleReturnDouble(11.11);


        // 在Java中打印输出
        Log.i("MainActivity","boolean: "+b);
        Log.i("MainActivity","byte: "+b1);
        Log.i("MainActivity","char: "+c);
        Log.i("MainActivity","short: "+s);
        Log.i("MainActivity","int: "+i);
        Log.i("MainActivity","long: "+l);
        Log.i("MainActivity","float: "+f);
        Log.i("MainActivity","double: "+d);

    }

    // 定义本地方法
    public native boolean passBooleanReturnBoolean(boolean b);
    public native byte passByteReturnByte(byte b);
    public native char passCharReturnChar(char c);
    public native short passShortReturnShort(short s);
    public native int passIntReturnInt(int i);
    public native long passLongReturnLong(long l);
    public native float passFloatReturnFloat(float f);
    public native double passDoubleReturnDouble(double d);

    static {
        System.loadLibrary("native-lib");
    }

}

本地C++文件中代码:

#include <jni.h>
#include <string>
#include "mylog.h"
#include "../java/com_aidesudi_testjni_MainActivity.h"

/*
 * Class:     com_aidesudi_testjni_MainActivity
 * Method:    passBooleanReturnBoolean
 * Signature: (Z)Z
 */
JNIEXPORT jboolean JNICALL Java_com_aidesudi_testjni_MainActivity_passBooleanReturnBoolean
        (JNIEnv *, jobject, jboolean b){

    LOGI("%d in %d bytes", b, sizeof(b));

    return !b;

}

/*
 * Class:     com_aidesudi_testjni_MainActivity
 * Method:    passByteReturnByte
 * Signature: (B)B
 */
JNIEXPORT jbyte JNICALL Java_com_aidesudi_testjni_MainActivity_passByteReturnByte
        (JNIEnv *, jobject, jbyte b){
    LOGI("%d in %d bytes", b, sizeof(b));
    return b+1;
}

/*
 * Class:     com_aidesudi_testjni_MainActivity
 * Method:    passCharReturnChar
 * Signature: (C)C
 */
JNIEXPORT jchar JNICALL Java_com_aidesudi_testjni_MainActivity_passCharReturnChar
        (JNIEnv *, jobject, jchar c){

    LOGI("%d in %d bytes", c, sizeof(c));
    c = '*';
    return c;
}


/*
 * Class:     com_aidesudi_testjni_MainActivity
 * Method:    passShortReturnShort
 * Signature: (S)S
 */
JNIEXPORT jshort JNICALL Java_com_aidesudi_testjni_MainActivity_passShortReturnShort
        (JNIEnv *, jobject, jshort s){

    LOGI("%d in %d bytes", s, sizeof(s));

    return s - 1;
}

/*
 * Class:     com_aidesudi_testjni_MainActivity
 * Method:    passIntReturnInt
 * Signature: (I)I
 */
JNIEXPORT jint JNICALL Java_com_aidesudi_testjni_MainActivity_passIntReturnInt
        (JNIEnv *, jobject, jint i){

    LOGI("%d in %d bytes", i, sizeof(i));

    return i + 1;
}

/*
 * Class:     com_aidesudi_testjni_MainActivity
 * Method:    passLongReturnLong
 * Signature: (J)J
 */
JNIEXPORT jlong JNICALL Java_com_aidesudi_testjni_MainActivity_passLongReturnLong
        (JNIEnv *, jobject, jlong l){
    LOGI("%d in %d bytes", l, sizeof(l));

    return l + 1;
}

/*
 * Class:     com_aidesudi_testjni_MainActivity
 * Method:    passFloatReturnFloat
 * Signature: (F)F
 */
JNIEXPORT jfloat JNICALL Java_com_aidesudi_testjni_MainActivity_passFloatReturnFloat
        (JNIEnv *, jobject, jfloat f){
    LOGI("%d in %d bytes", f, sizeof(f));

    return f + 1.5;
}

/*
 * Class:     com_aidesudi_testjni_MainActivity
 * Method:    passDoubleReturnDouble
 * Signature: (D)D
 */
JNIEXPORT jdouble JNICALL Java_com_aidesudi_testjni_MainActivity_passDoubleReturnDouble
        (JNIEnv *, jobject, jdouble d){

    LOGI("%d in %d bytes", d, sizeof(d));

    return d + 1.5;
}

最后打印结果如下:



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值