JNA简单范例

简介: JNA简单范例

C头文件

#ifndef __JNATEST_H__
#define __JNATEST_H__
#define LOG_HERE() printf("%s-%d\n", __func__, __LINE__)
void test_jna();
#endif

C代码

#include <stdio.h>
#include "jnatest.h"
void test_jna()
{
    LOG_HERE();
    printf("called from JAVA\n");
}
JAVA代码
import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Platform;
public class JnaTest
{
  //继承Library,用于加载库文件  
  public interface CLibrary extends Library
    {
  CLibrary INSTANCE = (CLibrary) Native.loadLibrary(
            (Platform.isWindows() ? "msvcrt" : "c"), CLibrary.class);
  // 声明一个跟C语言的printf()一样的方法,
  void printf(String format, Object... args);
  } 
  public interface TestLibrary extends Library
    {
  TestLibrary INSTANCE = (TestLibrary) Native.loadLibrary("jnatest", TestLibrary.class);
        void test_jna();
  } 
  public static void main(String[] args)
    {
  //调用  
  CLibrary.INSTANCE.printf("From JAVA To C, year=%d\n", 2022);
        TestLibrary.INSTANCE.test_jna();
  }
}


安装依赖库

sudo apt install -y openjdk-8-jdk
sudo apt install -y libjna-java
sudo apt install -y libjna-platform-java

编译

gcc -fPIC -shared -o libjnatest.so jnatest.c
sudo ldconfig
javac -extdirs /usr/share/java JnaTest.java

测试

USJ_DIR=/usr/share/java
CLASS_DIRS=.
CLASS_DIRS=${CLASS_DIRS}:${USJ_DIR}/jna.jar
CLASS_DIRS=${CLASS_DIRS}:${USJ_DIR}/jna-platform.jar
java  \
    -cp ${CLASS_DIRS} \
    JnaTest
目录
相关文章
|
Java 测试技术 C#
【开发者笔记】java 利用jna调用c#的dll
          一、需求阐述:   如果我们的项目利用c#开发,到了开发后期需要和java组进行合作,其中有一部分业务逻辑利用c#已经code completed,那么我们可能会考虑用java来调用现成的c#dll实现需求。
17412 0
|
Java
JNA简单范例
JNA简单范例
84 0
|
Java 计算机视觉
OpenCV最简JAVA版范例
OpenCV最简JAVA版范例
146 0
|
Java Linux Android开发
|
API
OC底层知识(九) : Runtime(下)
OC底层知识(九) : Runtime(下)
108 0
OC底层知识(九) : Runtime(下)
|
算法 Java Linux
JDK核心JAVA源码解析(5) - JAVA File MMAP原理解析(下)
JDK核心JAVA源码解析(5) - JAVA File MMAP原理解析(下)
|
存储 算法 Java
JDK核心JAVA源码解析(5) - JAVA File MMAP原理解析(上)
JDK核心JAVA源码解析(5) - JAVA File MMAP原理解析(上)
JDK核心JAVA源码解析(5) - JAVA File MMAP原理解析(中)
JDK核心JAVA源码解析(5) - JAVA File MMAP原理解析(中)
|
监控 Java 测试技术
字节码编程,Javassist篇一《基于javassist的第一个案例helloworld》
在字节码编程方面有三个比较常见的框架;ASM、byte-buddy、Javassist,他们都可以对这字节码进行操作,只是操作方式和控制粒度不同。 其中 「ASM」 更偏向于底层,需要了解 「JVM」 虚拟机中指定规范以及对局部变量以及操作数栈的知识。虽然在编写起来比较麻烦,但是它也是性能最好功能最强的字节码操作框架。常见的会用在 「CGLIB」 动态代理类中,以及一些非入侵的探针监控场景中。 另外两个框架都是有强大的 API,操作使用上更加容易控制。虽然对对比上会比 「ASM」 性能差一些,但不是说性能完全不好。同样在一些监控场景中也用的非常多。如果你细心可以在你的工程 「jar」 包搜索一
333 0
字节码编程,Javassist篇一《基于javassist的第一个案例helloworld》
|
监控 Java Linux
用JNA实现JAVA调用C语言中遇到的问题
因为计网大作业要求写一个网络流量监控系统,然后查阅资料后发现,计算机网络领域其实规定了了一组API接口规范供操作系统实现,这组API接口规范叫做PCAP(Packet Capture),Windows用winpcap(查阅后其实已经废弃了,现在用的是npcap)实现了该接口,linux用libpcap实现了该接口,由于个人比较喜欢用Java,所以必不可少的就是要养Java调用C了,这次调用C遇到了不少问题,这里说一下。
231 0

热门文章

最新文章