首页 > 其他分享 >JNA字符串类型操作

JNA字符串类型操作

时间:2023-03-15 21:24:44浏览次数:35  
标签:String int jna char 类型 JNA outstr 字符串 public

1. 返回字符串类型

c/c++代码

  • 全局变量
char retp[1024];
const char* getStr1(int a, int b){
    memset(retp, 0, 1024);
    char outstr[256];
    memset(outstr, 0, 256);
    if (outstr != 0){
        sprintf_s(outstr, "汉字out DLL汉字: %d + %d==%d\n", a, b, (a + b));
    }
    strcpy_s(retp, outstr);
    return retp;
}
  • malloc函数分配空间
const char* getStr2(int a, int b){
    char* retp = (char*)malloc(1024);
    memset(retp, 0, 1024);
    char outstr[256];
    memset(outstr, 0, 256);
    if (outstr != 0){
        sprintf_s(outstr, "汉字out DLL汉字: %d + %d==%d\n", a, b, (a + b));
        //printf("%s",outstr);
    }
    strcpy_s(retp, strlen(outstr) + 1, outstr);
    return retp;
}

java代码

package com.jnademo;

import com.sun.jna.Library;
import com.sun.jna.Native;

public class JnaTest {

	public interface CLibrary extends Library {
		CLibrary INSTANCE = (CLibrary) Native.load("E:\\dllws\\jnaTest\\x64\\Debug\\jnaTest.dll",
				CLibrary.class);
		
	    String getStr1(int a, int b);
	    
	    String getStr2(int a, int b);
	}
	
	public static void main(String[] args) {
		System.setProperty("jna.encoding","GBK");
		System.out.println(CLibrary.INSTANCE.getStr1(1, 3));
		System.out.println(CLibrary.INSTANCE.getStr2(2, 3));
	}
  
}

要注意添加System.setProperty("jna.encoding","GBK");否则会出现乱码。具体规则

  • c++ char* GBK编码时
System.setProperty("jna.encoding", "GBK");
  • c++ char* UTF8编码时
System.setProperty("jna.encoding", "UTF-8");

另外,其实还有个更简单的办法,JNA提供了一个宽字符字符串WString,当然c++接口参数类型要使用wchar_t*,这样WString就可以无缝转wchar_t*了,不用做任何修改,也绝对不会乱码。

C/C++接收字符串类型

C/C++代码

bool JavaStr(char* szText, int textLen) {
    if (szText == NULL || textLen <= 0) {
        return false;
    }
    std::string strText(szText, textLen);
    //OutputDebugStringA("JavaStr:");
    //OutputDebugStringA(strText.c_str());
    cout << strText.c_str() << endl;
    return true;
}

java代码

package com.jnademo;

import java.io.UnsupportedEncodingException;
import java.util.Arrays;
import java.util.List;

import com.sun.jna.Library;
import com.sun.jna.Native;

public class TestStructDemo {
	
	public interface TestStruct extends Library {
		
		TestStruct INSTANCE = (TestStruct) Native.load("E:\\dllws\\jnaTest\\x64\\Debug\\jnaTest.dll",
				TestStruct.class);
		
	    public boolean JavaStr(String str, int strLen);   // 使用String传参数,中文会参数乱码
	    
	    public boolean JavaStr(byte[] str, int strLen);   // 使用byte[]传参数,中文正常
	}
    
	public static void main(String[] args) throws UnsupportedEncodingException {
        //https://blog.51cto.com/softo/6009271
        String utf8Str = "UTF8转成GBK";
        String gbkStr = new String(utf8Str.getBytes("UTF-8"), "GBK"); // UTF8转成GBK
        byte[] gbkBytes = utf8Str.getBytes("UTF-8");
        TestStruct.INSTANCE.JavaStr(gbkStr, gbkStr.length());      // 传字符串C++接收时中文是乱码
        TestStruct.INSTANCE.JavaStr(gbkBytes, gbkBytes.length);    // 传字节数组C++接收中文正常
	}

}
参考:
https://blog.csdn.net/redchairman/article/details/108438202
https://blog.csdn.net/houmingyang/article/details/127071298

标签:String,int,jna,char,类型,JNA,outstr,字符串,public
From: https://www.cnblogs.com/happyhuangjinjin/p/17220049.html

相关文章

  • 剑指 Offer 58 - II. 左旋转字符串
    题目剑指Offer58-II.左旋转字符串字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"......
  • Windows 下 JNA 调用动态链接库 dll
    1.创建动态链接库项目创建jnaTest项目下一步中填写项目名称和存储的目录;然后直接创建即可创建结果2.定义头文件#pragmaonce#ifndefJNA_TEST_H#defineJNA......
  • Java基本数据类型
    Java基本数据类型Java有数据类型分为两大类:内置数据类型引用数据类型内置数据类型Java一共八种数据类型:六种数字类型(四个整形、两个浮点性)一种字符类型、一种布尔型......
  • java类型转换方式
    java类型转换方式mapstruct并不好用,代码臃肿,性能高一点参考https://blog.csdn.net/WX5991/article/details/121936717......
  • 力扣---1662. 检查两个字符串数组是否相等
     给你两个字符串数组word1和word2。如果两个数组表示的字符串相同,返回true;否则,返回false。数组表示的字符串 是由数组中的所有元素按顺序连接形成的字符串......
  • 【学习日志】Java基本数据类型的自动装箱和拆箱
    //测试代码publicstaticvoidmain(String[]args){Integera=1;Integerb=2;Integerc=3;Integerd=3;Integ......
  • Java字符串基础练习题2(较难)
    ​生成验证码内容:可以是小写字母,也可以是大写字母,还可以是数字​规则: 长度为5 内容中是四位字母,1位数字。 其中数字只有1位,但是可以出现在任意的位置。publicstati......
  • 达梦数据库报错:数据类型不匹配
    最近在用达梦数据库,今天碰到一个问题,报错:数据类型不匹配。查询条件中有个字段是TEXT类型,jdbcType之前是VARCHAR,我把它改成了LONGVARCHAR,心想这下应该好了吧,结果还是报错,......
  • Python如何去掉字符串所有空格?
    Python去掉字符串所有空格的方法大致有五种,本篇文章通过代码实例为大家详细的介绍一下这五种方法,对学习Python的小伙伴非常具有参考价值,快跟着小编来学习一下吧。1......
  • 第1课:实战演示JVM内存四大类型问题:Heap、Stack、Contant、DirectMemory等
    王家林老师微博:​​http://weibo.com/ilovepains/​​第1课:实战演示JVM内存四大类型问题:Heap、Stack、Contant、DirectMemory等 运行结果         ......