JNI (java native interface)
文章平均质量分 58
Java 操作操作系统底层api函数库
诗水人间
要想走的更远,就需要思考更深层次的问题。冷静、智慧、深沉是我所向往的
展开
-
JNI/JNA 中如何从C/C++/C# 转换为java的String,持续更新
在写JNI的过程中,因为调用的是操作系统的api,导致所使用的类型并不是基本类型,windows定义了大类的类型,比如WCAHR啥的,每次调api用到类型就感觉头疼,因为我希望是通过java调用C,那么最终肯定是要转换为java的对象。在写代码的过程中,为了方便做类型转换,我一般都是将字符串相关类型的数据转CString,然后CString转jstring。下面把我遇到的情形都列下来场景一、WCHAR * 转 jstring如:WCHAR* buffer;CString cstr = buffer原创 2022-04-19 00:45:02 · 1640 阅读 · 0 评论 -
JNA实现远程线程注入
首先准备一个dll,为了能看到效果最好是dllMain返回一个对话框或者窗口,可以很明显的看出注入是否成功。下面的WxDemoDll.dll 一个64位的dll主界面如下,如果注入成功会在目标进程起一个线程跑这个对话框,然后在这个dll里面写代码就是代码注入。相当于自己调自己JNA实现注入:package top.yumbo.demo.inter.x64;import com.sun.jna.Memory;import com.sun.jna.Pointer;import com.sun.原创 2022-04-08 20:08:02 · 706 阅读 · 0 评论 -
JNA 中 String 转 Pointer
最近在写JNA的过程中需要将字符串转Pointer对象,原因是jna的api要求传一个Pointer,直接的字符串则不能处理,但发现并不能通过new 得到Pointer对象。但是通过内部的方法可以得知有一些方法似乎就是我们想要的,例如setString方法com.sun.jna.Pointer对象是有setString方法的,但是你会发现我们没法通过new创建一个Pointer对象,也就没法直接用。可以通过import com.sun.jna.Memory;直接在内存中申请一块空间,然后给这块内存空间原创 2022-04-05 05:22:40 · 2781 阅读 · 0 评论 -
JNA 中 GetProcAddress(HMODULE hmodule, int ordinal) 的正确使用方式。LoadLibrary
随着对JNA的深入,需要用到GetProcAddress(HMODULE hmodule, int ordinal)方法,在C语言中第二个参数是一个字符串(通过传入函数的名称得到函数回调地址),但是在JNA中却没用提供这个方法,个人看了一下源码仓库社区谈到的issue,似乎也只有这个方法。但是社区以及源码中没有相关资料对这个ordinal做过多解释。一方面这个值取决于使用dll文件(例如:Kernel32.dll、NTdll.dll等文件),这个ordinal只是用来获取对应的dll文件中的函数序号,那么原创 2022-04-05 05:18:20 · 2770 阅读 · 0 评论 -
是使用Thread.sleep(200) 还是使用 LockSupport.parkNanos(200*1000*1000l) ?
相信这个问题很少人会想过问这个问题,但是看到相关文章后定然是新奇。我相信有很多人都知道LockSupport 这个工具类,但绝大多数人学JUC都只是处于应用JUC。没有对底层原理思考。那么在我提出这个问题的时候,你能说出其中的一二吗?Thread.sleep 与 LockSupport.parkNanos 两者现象都能让线程暂停下来,但是底层的原理有所区别。在java类库中2个方法都标有相应的注释,注释中解释到: sleep 虽然让线程暂停了,但是不会释放资源,而LockSupport.park会释原创 2022-03-27 05:12:45 · 4158 阅读 · 0 评论 -
MFC 基础入门
windows底层 API 是由C语言写的,而MFC则是在此基础上通过C++进行了封装。要想利用MFC进行编程,那么就得从main方法开始MFC的main函数C的写法是温馨小提示:函数变量名如果带有p的一般都是指针,入参的时候的传地址#include <Windows.h>int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPTSTR lpCmdLine, int nShowCmd) { // 主程序内容原创 2022-02-06 21:21:48 · 6767 阅读 · 0 评论 -
Clion 使用MFC库,本地main方法想run一下失败后的解决方法
最近在写JNI,打算用java去调 C 或 C++ 去操作操作系统底层的API。MFC编程已经算是一个非常老的技术了。在MFC库中提供了大量的windows-api,故准备写JNI去调用windows底层api。因为习惯使用Jetbrains家的产品,对于快捷键从Idea系列无缝对接所以选择了Clion作为C的编写。当然这里也可以选择Visual Studio。使用Clion写C的话,你需要 配置编译环境(按照这篇文章进行配置即可)如果你不想麻烦可以使用Visual Studio下载好 MFC库,这原创 2022-01-31 03:28:03 · 5362 阅读 · 0 评论 -
CLion搭建C环境、cmake、make、MingGW
下载Clion环境所需的压缩包https://download.csdn.net/download/qq_41813208/13139231解压缩后分别是下面两个文件第一、将cmake-3.17.1-win64-x64.msi双击进行安装,选一个安装路径安装完就可以了。第二、将x86_64-7.2.0-release-posix-seh-rt_v5-rev1.7z解压得到mingw64,实际上就是MinGW64关于makefile文件需要将mingw64/bin/文件夹下的 mingw32-ma原创 2020-12-04 03:38:21 · 25473 阅读 · 0 评论 -
JNI 对于 java 与 C++ 之间的String的处理,java通过JNI调C传入字符串“abcdef“ 方法返回一个新的字符串,比如每个字符+1变成:“bcdefg“
这里需要思考一个问题:作为一个java程序员,对于String自然是很熟,java去调C++/C,因为java是字符串是对象,而对于C来说字符串则是字符指针,约定以00结尾结束字符串。C++对于字符串也可以和java一样直接""表示JNI的方式,java将字符串传C++,然后返回一个新的字符串 示例:定义java的native方法package top.yumbo.jni;public class JavaCallCpp{ public native String doXXX(String s原创 2022-01-25 02:25:57 · 1457 阅读 · 0 评论 -
JNI 的hello world 案例,java调C,C返回“JNI Hello“ 字符串,java得到后打印出来
一、用IDEA创建java项目1、写一个带有native修饰的方法,注意包路径package top.yumbo.jni;public class JNIHelloWorld { public static native String hello();}2、生成头文件java10以后去除了javah,采用javac -h 代替命令格式如下:javac -h 生成的.h文件目录 .java源文件javac -h ./ top/yumbo/jni/JNIHelloWorld.ja原创 2022-01-23 08:28:58 · 1049 阅读 · 0 评论