使用JNA实现Java对C的调用

jna coding

C

#include <stdio.h>
int add(int x, int y)
{
  return x+y;
}

Java

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

public class JnaTest {
    public interface CLibrary extends Library {
        CLibrary INSTANCE = (CLibrary) Native.loadLibrary((Platform.isWindows() ? "msvcrt" : "c"), CLibrary.class);
        void printf(String format, Object... args);
    }

    public interface MyC extends Library {
        int add(int x, int y);
    }

    public static void main(String[] args) {
        CLibrary jnaLib = CLibrary.INSTANCE;
        MyC myc = (MyC) Native.loadLibrary("myc", MyC.class);
        jnaLib.printf("1+2=%d", myc.add(1, 2));
    }
}

build C

mac os x

gcc -dynamiclib -o libmyc.dylib myc.c
export DYLD_LIBRARY_PATH=.

linux

gcc -Wall -fPIC -O2 -c -o libmyc.o myc.c
gcc -shared -o libmyc.so libmyc.o
export LD_LIBRARY_PATH=.

build & run java

jna_jar=/Users/erichan/.m2/repository/com/sun/jna/jna/4.2.2/jna-4.2.2.jar
javac -classpath $jna_jar JnaTest.java
java -classpath $jna_jar:. JnaTest
时间: 2024-11-09 00:20:31

使用JNA实现Java对C的调用的相关文章

[Java] 利用Axis库调用C#的Web Service

[Java] 利用Axis库调用C#的Web Service 编写者 日期 关键词 郑昀@ultrapower 2005-8-2 Java Web Service Axis C#   概述 试图从Java调用C#编写的Web Service,借用了王咏刚的wsCaller源代码中DynamicInvoker类. 开始不清楚DynamicInvoker类的portName的含义,望文生义,以为是8080之类的端口号,实际上是下面wsdl中的wsdl:port 节点的"name"属性值&q

有用java 编的程序 调用 hbase 接口的吗?

问题描述 有用java 编的程序 调用 hbase 接口的吗? 有用java 编的程序 调用 hbase 接口的吗?最好具体一些,对这方面不太懂 解决方案 http://blog.csdn.net/lifuxiangcaohui/article/details/39997205

Java exec详解 - 调用系统命令以及进程

调用系统命令 执行系统命令相对来说比较容易,可以通过使用 Runtime 和 Process 两个类来执行.我们可以通过Process的getInputStream和getErrorStream两个方法获取到结果和错误信息的输入流,下面就是实例代码,改代码通过执行 ps -ef 命令来获取结果(执行在mac或者linux上) 1234567891011121314151617181920212223242526272829303132333435 package map; import java

第三方dll文件-Java中利用jawin调用dll文件,invoke的参数问题

问题描述 Java中利用jawin调用dll文件,invoke的参数问题 各位大神: dll中的被调用方法如下: long WINAPI AutoOpenComPort(long* Port, unsigned char *ComAdr, unsigned char Baud,long *FrmHandle); 其中: Port:输出变量, ComAdr:输入/输出变量 Baud:输入变量 FrmHandle:输出变量 请问它的 msgBox.invoke(instructions, stack

java类中方法调用问题

问题描述 java类中方法调用问题 import java.awt.*;import javax.swing.*;import java.awt.event.*; public class TestTextComponent extends JFrame { private JTextField textField = new JTextField(15); private JPasswordField passwordField = new JPasswordField(15); privat

彩信发送-java发送彩信,调用电信彩信接口;可苹果手机接收的彩信内容是混乱的

问题描述 java发送彩信,调用电信彩信接口:可苹果手机接收的彩信内容是混乱的 java发送彩信,调用电信彩信接口:可苹果手机接收的彩信内容是混乱的,安卓手机接收正常.面对这种问题,我已经研究了两个星期:至今都没有解决:求各位高手指点一二.谢谢!

java或者js怎么调用浏览器文件下载框中的保存,或者打开选择框

问题描述 java或者js怎么调用浏览器文件下载框中的保存,或者打开选择框 浏览器下载文件时,有个打开,有个保存,java或者js能通过代码调用么? 怎么操作 解决方案 js设置location跳转到你要下载的文件地址就好了 location='要下载的文件地址' 如果你的文件是文本文件,图片这种浏览器能解析的,你需要动态设置content-disposition为attachment,然后输出文件才能弹出保存文件对话框,要不是直接显示在浏览器里面的,具体看下面的链接 http://www.qi

java定时器-java的定时器ScheduledExecutorService调用问题,急!!!

问题描述 java的定时器ScheduledExecutorService调用问题,急!!! 我自己写了个java类,类中用了ScheduledExecutorService定时器自动执行任务,然后把这个工程弄成了一个jar包,然后写一个.bat去调用,程序启动之后会自动进行定时任务,但问题来了,我想写一个.bat能够停止正在执行的定时任务,该怎么做? 解决方案 taskkill /im java.exe 解决方案二: 不会啊 呵呵 解决方案三: java定时器

关于java程序通过命令调用Androidjar包疑难杂症?求高手指点

问题描述 现状:本人通过在本地cmd命令行下调用Android的jar包可以执行成功(java-jarsignapk.jartestkey.x509.pemtestkey.pk8ParentManager.apkParentManager_sign.apk),但是通过java应用程序命令调用Android的jar包就不行了.java应用程序代码:这样就不能成功执行jar包了publicclassmakeFile{publicstaticvoidmain(String[]args){String[