JNA回调 Java C语言

  1. JNA以及开发环境介绍

    1. 介绍
      1. JNA 是基于JNI的, 用于在Java层调用C的代码
    2. JNA和JNI的对比
      1. JNA不需要特意为C编写代码 ,所有操作在Java端完成
        1. JNI需要C的代码包含jni.h头文件 并且按照JNI的格式编写
    3. 本教程的C语言使用Makefile 在Linux下编译完成 生成so文件
      1. 读者如果使用Windows那么可以使用VS编译测试C代码 生成dll文件
  2. 准备C代码

    1. #include <stdio.h>
      
      int add(int x,int y){
          printf("%d\n",x+y);
          return x + y;
      }
      
      void testString(const char *str){
          printf("%s\n",str);
      }
      
      int test_callback(int(*f)(int x,int y)){
          int x = f(3,4);
          printf("callback :%d\n",x);
          return x;
      }
      
    2. 编译见Makefile

  3. JNA之普通函数调用

    1. 获取so文件实例对象 以及声明so文件中有哪些函数

      1. package com.example;
        
        import com.sun.jna.Library;
        import com.sun.jna.Native;
        import com.sun.jna.*;
        
        public interface JnaTest extends Library{
            JnaTest INSTANCE = Native.load("main",JnaTest.class);
            int add(int x,int y);
            void testString(String x);
        }
        
    2. 调用

      1. package com.example;
        public class Main 
        {
            public static void main( String[] args )
            {
                //测试普通调用
                JnaTest.INSTANCE.add(2, 3);
                JnaTest.INSTANCE.testString("helloworld");        
            }
        }
        
  4. JNA之回调函数

    1. 导入so 以及声明使用回调函数的函数

      1. package com.example;
        import com.sun.jna.Library;
        import com.sun.jna.Native;
        import com.sun.jna.*;
        
        public interface JnaTest extends Library{
            //导入so 在$LD_LIBRARY_PATH寻找
            JnaTest INSTANCE = Native.load("main",JnaTest.class);
            int add(int x,int y);
            void testString(String x);
        
            //声明底层有一个名为test_callback的函数 他的参数是一个回调函数
            int test_callback(addCallback f);
            int test_callback(multiplyCallback f);
        
            //实现接口的目的是 将Java的方法通过JNA转换为C的函数指针
            //声明回调函数
            public interface myCallback extends Callback{
                //这个接口里只能有一个public 方法
                public int callback(int x,int y);
            }
        
            //实现回调函数 加法
            public static class addCallback implements myCallback{
                @Override
                public int callback(int x,int y){
                    return x + y;
                }
            }
            //实现回调函数 乘法
            public static class multiplyCallback implements myCallback{
                @Override
                public int callback(int x,int y){
                    return x * y;
                }
            }
        
        }
        
      2. 调用

        1. package com.example;
          public class Main 
          {
              public static void main( String[] args )
              {
                  //测试回调 分别传入不同的回调函数
                  JnaTest.INSTANCE.test_callback(new JnaTest.addCallback());
                  JnaTest.INSTANCE.test_callback(new JnaTest.multiplyCallback());
              }
          }
          
  5. 源代码

  6. 其他注意事项

    1. 在Linux下 so库库可以由LD_LIBRARY_PATH环境变量设置 , 比如。

      1. #在项目根目录下执行
        export LD_LIBRARY_PATH=`pwd`/src/main/java/com/example
        
      2. 顺便说一下当然也可ldconfig /系统标准库目录

    2. 在windows下只要把dll 和java放在一个目录下即可 不需要设置环境变量

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值