JNA(三)数据类型映射与使用

目录


前言

本文主要学习动态库与Java数据类型映射以及基本调用

一、数据类型映射

Native Type(C)Size(大小)Java Type
char8-bit integerbyte
short16-bit integershort
wchar_t16/32-bit characterchar
int32-bit integerint
intboolean valueboolean
long32/64-bit integerNativeLong
long long64-bit integerlong
float32-bit FPfloat
double64-bit FPdouble
char*C stringString
void*pointerPointer

注:如果C语言返回的指针其占用空间是动态分配的,则需要额外添加清理函数进行清理

二、调用

1.生成dll文件

        在CLion中编辑头文件(library.h),定义方法如下:

#ifndef CDYNAMICDEMO_LIBRARY_H
#define CDYNAMICDEMO_LIBRARY_H

#include <string.h>
#include <stdlib.h>

// 项目自带hello方法
void hello(void);

// 数据类型映射
char charToByte();

short shortToShort();

wchar_t wchartToChar();

int intToInt();

int intToBoolean();

long longToNativeLong();

long long longlongToLong();

float floatToFloat();

double doubleToDouble();

char *charPointerToString();

void *voidPointerToPointer();

// 清理上面的指针
void cleanVoidPointerToPointer(void *v);

#endif //CDYNAMICDEMO_LIBRARY_H

 C代码文件(library.c):

#include "library.h"
#include <stdio.h>

void hello(void) {
    printf("Hello, World!\n");
}

// 数据类型映射
char charToByte() {
    char c = 'A';
    return c;
}

// -32768 ~ 32767
short shortToShort() {
    short s = 32767;
    return s;
}

wchar_t wchartToChar() {
    wchar_t w = L'中';
    return w;
}

int intToInt() {
    int i = -1;
    return i;
}

int intToBoolean() {
    return intToInt();
}

long longToNativeLong() {
    long l = 1;
    return l;
}

long long longlongToLong() {
    long long ll = 11;
    return ll;
}

float floatToFloat() {
    float f = 3.14F;
    return f;
}

double doubleToDouble() {
    double d = 3.14159265;
    return d;
}

char *charPointerToString() {
    char *s = "Hello world!";
    return s;
}

void *voidPointerToPointer(int len) {
    void *v = malloc(sizeof(char) * len);
    return v;
}

void cleanVoidPointerToPointer(void *v) {
    free(v);
}

 通过编译生成库文件:libCDynamicDemo.dll

2.Java调用

使用IDEA创建Maven项目

项目结构

Maven依赖

<dependency>
	<groupId>net.java.dev.jna</groupId>
	<artifactId>jna-platform</artifactId>
	<version>5.13.0</version>
</dependency>

<dependency>
	<groupId>org.projectlombok</groupId>
	<artifactId>lombok</artifactId>
	<version>1.18.20</version>
</dependency>

Java代码

package com.dynamic.demo.base;

import com.sun.jna.*;

public interface MappingLibrary extends Library {
    MappingLibrary INSTANCE = Native.load(Platform.isWindows() ? "libCDynamicDemo" : "", MappingLibrary.class);

    // 项目自带hello方法
    void hello();

    // 数据类型映射
    char charToByte();

    short shortToShort();

    char wchartToChar();

    int intToInt();

    boolean intToBoolean();

    NativeLong longToNativeLong();

    long longlongToLong();

    float floatToFloat();

    double doubleToDouble();

    String charPointerToString();

    Pointer voidPointerToPointer(int len);

    // 清理上面的指针
    void cleanVoidPointerToPointer(Pointer pointer);

    public static void main(String[] args) {
        MappingLibrary.INSTANCE.hello();

        System.out.println(MappingLibrary.INSTANCE.charToByte());
        System.out.println(MappingLibrary.INSTANCE.shortToShort());
        System.out.println(MappingLibrary.INSTANCE.wchartToChar());
        System.out.println(MappingLibrary.INSTANCE.intToInt());
        System.out.println(MappingLibrary.INSTANCE.intToBoolean());
        System.out.println(MappingLibrary.INSTANCE.longToNativeLong());
        System.out.println(MappingLibrary.INSTANCE.longlongToLong());
        System.out.println(MappingLibrary.INSTANCE.floatToFloat());
        System.out.println(MappingLibrary.INSTANCE.doubleToDouble());
        System.out.println(MappingLibrary.INSTANCE.charPointerToString());
        // 获取指针
        Pointer pointer = MappingLibrary.INSTANCE.voidPointerToPointer(3);
        System.out.println(pointer == null);
        MappingLibrary.INSTANCE.cleanVoidPointerToPointer(pointer);
    }
}

 注:这里定义的是一个接口,然后main方法也写在这里了。写法各式各样,这样处理主要是为了演示方便。下面看输出


总结

1.演示了基本类型映射的使用方法

2.对指针需要额外进行清理,特别的,Java控制台的输出顺序是:Java本地代码优先输出、其次是动态库中的输出,最后是动态库中进行清理的输出(不要问为什么,偶也不是很清楚)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值