前言
关于环境和dll的生成,不懂的同学可以去查看JNA(一)与JNA(二)的内容
后续的内容都是以set和get进行:
所谓set,就是往动态库中发送;而get就是从动态库中获取
使用
1.C语言代码
头文件(library.h)
#ifndef CDYNAMICDEMO_LIBRARY_H
#define CDYNAMICDEMO_LIBRARY_H
#include <string.h>
#include <stdlib.h>
// 字符串的基本操作
void setString(char *text);
void getString(char **texts);
void cleanString(char *text);
#endif //CDYNAMICDEMO_LIBRARY_H
代码文件(library.c)
#include "library.h"
#include <stdio.h>
void setString(char *text) {
printf("\n接收到字符串: %s", text);
}
void getString(char **texts) {
// C语言中字符串的末尾是:\0
int len = 10;
// 一个类型用了三个关键字!
unsigned long long size = sizeof(char) * len;
*texts = malloc(size);
memset(*texts, 0, size);
strcpy(*texts, "HelloHel中");
}
void cleanString(char *text) {
free(text);
printf("\n清理字符串");
}
2.java代码
package com.dynamic.demo.strings;
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;
import com.sun.jna.Pointer;
import com.sun.jna.ptr.PointerByReference;
public interface StringLibrary extends Library {
StringLibrary INSTANCE = Native.load(Platform.isWindows() ? "libCDynamicDemo" : "", StringLibrary.class);
void setString(String text);
void getString(PointerByReference reference);
void cleanString(Pointer pointer);
public static void main(String[] args) {
StringLibrary.INSTANCE.setString("hello 中文!");
PointerByReference reference = new PointerByReference();
StringLibrary.INSTANCE.getString(reference);
Pointer pointer = reference.getValue();
// 从第一个字符开始输出
String text = pointer.getString(0);
System.out.println(text);
StringLibrary.INSTANCE.cleanString(pointer);
}
}
3.查看输出

4.代码比较

本文详细介绍了如何使用C语言和Java通过JNA进行动态库的set和get操作,包括C语言中的函数实现以及Java中的Library接口应用。
3303

被折叠的 条评论
为什么被折叠?



