首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在JNA包装器端隐藏C DLL函数的一些参数?

在JNA包装器端隐藏C DLL函数的一些参数,可以通过以下步骤实现:

  1. 创建一个Java接口,用于定义要调用的C DLL函数及其参数。在接口中,只暴露需要的参数,将不需要的参数隐藏起来。
  2. 创建一个Java类,实现上述接口,并使用JNA的注解来映射C DLL函数及其参数。
  3. 在实现类中,通过JNA的注解来指定参数的类型、名称和顺序。可以使用@Structure.FieldOrder注解来定义结构体的字段顺序。
  4. 在调用C DLL函数之前,可以在实现类中进行参数的处理。可以使用Java的数据结构来存储参数,然后将其转换为C DLL函数所需的格式。
  5. 使用JNA的Native.loadLibrary方法加载C DLL库,并创建一个实例对象。
  6. 调用实例对象的方法来调用C DLL函数,传递隐藏参数以及其他必要的参数。

通过以上步骤,可以在JNA包装器端隐藏C DLL函数的一些参数,只暴露需要的参数给调用方使用。

以下是一个示例代码:

代码语言:txt
复制
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Structure;

public interface MyDll extends Library {
    MyDll INSTANCE = Native.loadLibrary("mydll", MyDll.class);

    // 定义C DLL函数及其参数
    void myFunction(int visibleParam, HiddenParam hiddenParam);

    // 定义隐藏参数的结构体
    public static class HiddenParam extends Structure {
        public int hiddenField;

        @Override
        protected List<String> getFieldOrder() {
            return Arrays.asList("hiddenField");
        }
    }
}

public class Main {
    public static void main(String[] args) {
        MyDll.HiddenParam hiddenParam = new MyDll.HiddenParam();
        hiddenParam.hiddenField = 123;

        MyDll.INSTANCE.myFunction(456, hiddenParam);
    }
}

在上述示例中,MyDll接口定义了一个名为myFunction的C DLL函数,其中包含一个可见参数visibleParam和一个隐藏参数hiddenParam。隐藏参数使用了HiddenParam结构体来表示。

Main类中,我们创建了一个HiddenParam对象,并设置了隐藏参数的值。然后,通过调用MyDll.INSTANCE.myFunction方法,传递可见参数和隐藏参数来调用C DLL函数。

请注意,以上示例仅为演示目的,实际使用时需要根据具体的C DLL函数及其参数进行相应的修改。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Java跨语言调用,使用JNA访问Java外部接口

JNA中,它提供了一个动态C语言编写转发,可以自动实现Java和C数据类型映射,你不再需要编写C动态链接库。 也许这也意味着,使用JNA技术比使用JNI技术调用动态链接库会有些微性能损失。...但总体影响不大,因为JNA也避免了JNI一些平台配置开销。 3. JNA简单使用 JNA项目已迁移至Github,目前最新版本是4.1.0,已有打包好jar文件可供下载。...该常量通过Native.loadLibrary()这个API函数获得,该函数有2个参数: 第 一个参数是动态链接库dll/so名称,但不带.dll或.so这样后缀,这符合JNI规范,因为带了后缀名就不可以跨操作系统平台了...比如上例中printf函数在Windows平台下所在dll库名称是msvcrt,而在 其它平台Linux下so库名称是c。 第二个参数是本接口Class类型。...上面说到接口中使用函数必须与链接库中函数原型保持一致,这是JNA甚至所有跨平台调用难点,因为C/C++类型与Java类型是不一样,你必须转换类型让它们保持一致,比如printf函数C原型为

4.3K21

jnaerator:java调用动态库神器,JNA代码自动生成工具

https://blog.csdn.net/10km/article/details/79252303 众所周知,java程序如果要调用动态库(.so,.dll)函数,最传统方式是使用...相比JNI,JNA是一个很大进步,但java程序还是要写一些java代码才能正确调用动态库,动态库函数涉及所有结构类型都需要定义对应java类型,如果结构类型比较多是个很大工作量。...能不能更简单一些呢? 最近正为写调用动态库事儿头痛,虽然我也会写JNI代码,但实在太麻烦,总想找个捷径,看了JNA相关资料后,发现用JNA所需要写相关java代码其实都是很有规则。...这就是jnaerator jnaerator是google贡献一个开源项目,用于生成基于JNA/BridJ调用C/Object-C语言动态库java代码代码生成工具。...\ bin\THFeature.dll include\THFeature_i.h 参数说明: -runtime JNA 指定目标运行库为JNA, -runtime 可选值有(区分大小写

4.2K10

2019-04-08 Swig java Jni开发指南

Swig可以根据cc++代码生成jni代码工具,大大简化jni开发 Jnaerator可以根据cc++代码生成jna代码工具,大大简化jna开发 从难易度看,使用jnaerator开发jna...最简单,代码基本都是自动生成,但是jna开发有个很大缺点,就是如果c代码过于复杂,比如出现java调用c,然后c再回调java,java返回结果c还需要继续处理时候,经常出现不可控制crash,...除了c/c++关键字和预处理指令,接口文件还包含swig特有的预处理指令,该指令可用于优化生成封装代码。...执行以下命令,同1.d 只读变量 区别只是在生成包装类中,只读只有get函数,读写有get和set函数 a) 编写example.h /* 只读变量 */ int readOnly;...*.cxx javac -d . *.java java -cp . runme 类型转换 a) 错误情况 C函数包装 %module example int add_option

55510

java高级用法之:在JNA中将本地方法映射到JAVA代码中

下面的表格展示了Library Name和传入name之间映射关系: OS Library Name String Windows user32.dll user32 Linux libX11.so...大部分情况下,direct mapping和interface mapping具有相同映射类型,但是不支持Pointer/Structure/String/WString/NativeMapped数组作为函数参数值...如果要使用基础类型包装类,则必须使用自定义TypeMapper. 对象JAVA中方法映射来说,该映射最终会创建一个Function对象。...而InvocationMapper则更进一步, 允许您任意重新配置函数调用,包括更改方法名称以及重新排序、添加或删除参数。...还有一种情况是c语言中内联函数或者预处理宏,如下所示: // Original C code (macro and inline variations) #define allocblock(x

1.1K40

Java中一个逐渐被遗忘强大功能,强到你难以置信!!

说起Java,简单好用,但是Java中很多牛逼技术却逐渐被遗忘了~~ 在Java语言出现之前,很多系统都是使用CC++开发。...注意:本文中我使用jna Java类库实现JNI开发。 开发dll动态链接库 下载VS 小伙伴们可以在【冰河技术】公众号回复“vscode”,获取VS2010下载链接。...__declspec( dllexport ) //这参数是必须,也可以定义为.c头文件 MYLIBAPI double add(double a,double b); MYLIBAPI double...double b){ return a + b; } double mul(double a,double b){ return a*b; } //定义了一个返回java String类型参数...使用VS生成dll 这里变成Release,点击配置管理配置x64版本,这样生成dll就是x64版本,这点非常重要。 ? ? 配置完成以后右击项目点击生成按钮。 ?

43820

java高级用法之:在JNA中将本地方法映射到JAVA代码中

下面的表格展示了Library Name和传入name之间映射关系: OS Library Name String Windows user32.dll user32 Linux libX11.so...大部分情况下,direct mapping和interface mapping具有相同映射类型,但是不支持Pointer/Structure/String/WString/NativeMapped数组作为函数参数值...如果要使用基础类型包装类,则必须使用自定义TypeMapper. 对象JAVA中方法映射来说,该映射最终会创建一个Function对象。...而InvocationMapper则更进一步, 允许您任意重新配置函数调用,包括更改方法名称以及重新排序、添加或删除参数。...还有一种情况是c语言中内联函数或者预处理宏,如下所示: // Original C code (macro and inline variations) #define allocblock(x

99020

我敢说:99.9%程序员根本没在项目中使用过Java这个功能!

大家好,我是冰河~~ 说起Java,确实简单好用,但是Java中很多牛逼技术却被逐渐遗忘了~~ 在Java语言出现之前,很多系统都是使用CC++开发。...Java出现之后,由于其面向对象思想更加符合人们思维习惯,Java也不用像CC++那样需要程序员手动管理内存分配和回收。说白了,就是简单好用。...__declspec( dllexport ) //这参数是必须,也可以定义为.c头文件 MYLIBAPI double add(double a,double b); MYLIBAPI double...double b){ return a + b; } double mul(double a,double b){ return a*b; } //定义了一个返回java String类型参数...使用VS生成dll 这里变成Release,点击配置管理配置x64版本,这样生成dll就是x64版本,这点非常重要。 配置完成以后右击项目点击生成按钮。

12510

公式识别神器Mathpix for matlab 1.0.0版正式发布

Mathpix for matlab 1.0.0版界面 在B站收到不少伙伴评论,问小编开发这样工具到底意义何在,有什么创新之处,更何况官方还发布有专门版本。...小编开发这些科研小工具仅仅是个爱好而言,并希望这些小工具能给需要它的人带来便利,小编会一既往地为大家开发分享更多有用地科研小工具。...由于全局截图用到了Java,因此在安装运行之前建议先配置好Java环境(需要jre1.8及以上版本),步骤如下: ① 将jintellitype-1.3.9.jar、jna-5.4.0.jar、jna-platform...-5.4.0.jar复制到 Java安装目录\jre\lib 目录下 ② 如果是win32操作系统,就将dllJIntellitype32.dll复制到C:\Windows\System32目录下...,并用命令注册;若是win64操作系统,则用JIntellitype.dll替换掉默认64位dll即可。

1.8K20

JAVA-JNI初次接触

从学编程之前就对外挂比较感兴趣,刚开始学了一段时间E语言,又后来学了C语言, 上大学之后,找准了目标,主学JAVA和Android,不过对外挂这块儿还是很有兴趣, 就打算用JAVA看看能不能写一个小游戏修改...,用JAVA写了一个简陋植物大战僵尸阳光修改, 可以实现读取阳光值和修改阳光值,那么接下来几天就从JNI到CE找游戏基址到编写游戏修改。...; } } 运行这段代码之后,就会调用本地C动态库printf函数,然后输出"Hello,JNA!...文件 也可以是C++写DLL文件 User32 INSTANCE = Native.loadLibrary("User32",User32.class);...聪明如你,一定发现这两段代码共同之处,都是自定义一个接口然后继承JNI类, 然后主函数里面通过创建接口里面的实例,调用系统底层函数

73820

Elasticsearch源码分析四之JNA与swap浅析

initializeNatives方法入参 来看一段org.elasticsearch.bootstrap.Bootstrap#setup中代码: //初始化本地一些配置,创建临时文件等...,布尔类型,默认为true; bootstrap.ctrlhandler:按ctrl键处理,布尔类型,默认为true。...JNANatives.tryMlockall()方法,继续进入方法内部调用是JNACLibrary中方法 使用java调用dll和cpp文件方法很多,可以使用jni,jna,jnative等,其中...JNACLibray是通过JNA来调用linux和mac中cpp库文件,JNAKernel32Libray是通过调用windowskernel32.dll来执行相关操作。...api函数发生异常时,一般会将errno变量赋一个整数值,不同值表示不同含义,可以使用strerror()获取错误信息。

1.5K20

Linux下跨语言调用C++实践

argtypes与restype是动态库中函数参数属性,前者是一个ctypes类型列表或元组,用于指定动态库中函数接口参数类型,后者是函数返回类型(默认是c_int,可以不指定,对于非c_int...三个参数里,前两个是固定。JNIEnv中封装了jni.h里一些工具方法,jobject指向Java中调用类,即JniDemo,通过它可以找到Java里class中成员变量在C堆栈中拷贝。...3.1.5.2 JNA接入 JNA是在JNI基础上实现编程框架,它提供了C语言动态转发,实现了Java类型到C类型自动转换。...4.2 跨语言调用如何实现参数传递 C/C++函数调用标准过程如下: 在内存栈空间中为被调函数分配一个栈帧,用来存放被调函数形参、局部变量和返回地址。...通过上述工作,在非C++语言调用方服务中,可以将RPC调用转化为跨语言本地化调用,能够明显提升调用性能以及成功率,同时也能有效减少服务资源开销。

5.9K40

模拟隐蔽操作 - 动态调用(避免 PInvoke 和 API 挂钩)

此外,此 API 让您可以轻松地在 C# 中从内存中调用非托管代码(传递参数并接收输出),而无需执行一些像自注入 shellcode 这样变通方法。 我们通过Delegates魔力实现了这一点。....第二个是最重要。它从函数指针创建一个委托,并调用由委托包装函数,传入您提供参数参数作为对象数组传入,因此您可以以任何形式传入所需任何数据。...DInvoke 库为每个非托管函数提供了一个托管包装函数包装通过确保正确传递参数并返回正确类型对象来帮助用户。 值得注意是:PInvoke 比 DInvoke 对数据类型更宽容。...包装方法SharpSploit.Execution.DynamicInvoke.Native.NtCreateThreadEx采用您希望在普通 PInvoke 中使用所有相同参数。...首先,我们GetSyscallStub使用偷ntdll.dll在for中借用系统调用包装机器代码NtOpenProcess。

2K00

【火绒安全警报】热门游戏被病毒团伙利用 每天感染数十万台电脑

病毒执行流程图 游戏微安装包 该病毒安装包中都包含有一个病毒动态库(病毒动态库名通常为“游戏全拼首字母.dll”,:“tdzs.dll”对应“天地诸神”)。文件属性如下图所示: ?...external中封装方法列表 在构造external对象之后,会统计当前进程关系信息和一些本地计算机信息(:IP地址、MAC地址、CPU ID等),之后再将数据转为字符所对应二进制字符串,经过加密后将最终数据发送到...获取本地计算机信息 最终上传至服务数据,如下图所示: ? 上传数据 在将加密后数据上传C&C服务之后,C&C服务会返回一段被加密压缩数据。...del_dllservice函数代码逻辑 up_zlib1.dll up_zlib1.dll动态库被rundll32调用后会创建隐藏web控件,在后台暗刷流量,并且在访问导航页面的同时,病毒还利用JavaScript...添加脚本内容 程序会在获取到C&C服务地址(http://tj.im991.com/dh/view_360_uv_so.asp)末尾拼接“t=1”参数,如果没有该参数则无法获取到完整JavaScript

1.3K40

披露报告:流氓家族窃取用户浏览隐私活动

上述软件大多有正常软件功能包装,安装活跃用户较多,如此大规模隐私窃取活动在业内也比较罕见。...首先读取当前目录下hao**uc.jpg图片,看似正常图片但末尾被附加了加密PE文件,解开后为updatechecker_dll.dll,该模块被内存加载后调用导出函数EnteyPoint传入解密后参数执行...其另外两张同样也是隐藏PE文件分别为Report_dll.dll和Update_dll.dll: ?...对Lua脚本还原后其执行逻辑是在main函数中执行完弹窗后,会调用execute_urlreport函数进行url和cookie收集,该函数进行参数封装后调用接口函数invoke_exe_inject,...三、总结 当下谈及用户隐私安全,普遍更多侧重于和个人信息结合更紧密移动APP案例,但是PC同样保存了非常多有价值用户隐私信息,相对于移动,PC系统安全权限设置更加宽松开放,隐私窃取技术难度反而更低

92240
领券