精华内容
下载资源
问答
  • Java调用C语言动态库(JNA方式,持续)
    2021-02-12 09:58:00

    过程主要分为以下几个步骤:

    1、vs2017编写cpp/h代码,编译成dll,编译成功后,用depends查看库的依赖是否有缺失,也可以自己写个demo,调用这个dll中的函数,是否可以调用成功作为验证这个dll是否ok的方法。

    注意:编译这个dll的cpp和h文件时,注意要extern "C",

    eg:

    cpp:

    一定要注意红框的宏,不然会在java调用这个方法时提示:

    Exception in thread "main" java.lang.UnsatisfiedLinkError: Error looking up function

    2、将dll加入到jna 的jar包中,一般用好压打开,然后找到对应的目录,比如:java使用的是x64的jdk,dll也必须要是x64的,这个在编译dll时候选择,选择的方式如下:

    第一次使用的时候,没有x64,新加一个就好了,具体可以百度怎么新加一个。如果二者不都是x64或者x86,java在使用的时候会提示找不到dll:

    java.lang.UnsatisfiedLinkError: Unable to load library 'jndadll': Native library (win32-x86-64/jndadll.dll) not found in resource path

    在确保dll可用的时候,将dll加入jna的jar包,一般用好压打开,然后放到对应的目录,我的是win32_64的,对应的目录是:com\sun\jna\win32-x86-64 直接拖进去就行。

    3、idea工具编写demo使用jna中的c函数:

    (1)、idea新建java工程

    (2)、使用这个jna.jar包,方法:

    注意红框中的操作步骤。

    (3)、编写java代码:

    public class TestJNA {

    public interface CLibrary extends Library{

    CLibrary INSTANCE = (CLibrary)Native.load("jndadll", CLibrary.class);

    int checksum(String src_data, IntByReference check_ret);

    }

    public static void main(String[] args) {

    // write your code here IntByReference check_ret = new IntByReference();

    int flag = TestJNA.CLibrary.INSTANCE.checksum("123",check_ret);

    System.out.println("MainActivity, checksum的返回标记:" + flag);

    }

    }

    (4)、编译java,执行即可以了。其他使用可以参考jna官网手册java-native-access/jna

    更多相关内容
  • java调用c语言

    2017-04-06 09:02:59
    java调用c,总结了各种类型
  • java调用C语言动态链接库
  • 4 // 创建HelloWorld.java 5 class HelloWorld 6 { 7 private native void print(); 8 public static void main(String[] args) 9 { 10 new HelloWorld().print(); 11 } 12 13 static
  • Java调用C语言动态库(JNA方式):回调函数、结构体数组传参、结构体数组返回-附件资源
  • JAVA调用C语言程序

    千次阅读 2020-08-27 13:42:00
    JAVA调用C语言程序JAVA调用C语言程序1. 编写带有native声明的方法的Java类2. 使用javah 生成:jniSample.h的头文件3. 使用C实现本地sum方法:(这里我生成文件时候,误写了jinSample)。4. 将本地方法编写的文件生成...

    JNI:

    java Native INterface:JAVA原生数据库
    java与C互操作
    C调用JAVA程序(基于反射的方法)

    JAVA调用C语言程序

    JNI实现native方法

    本次操作在Mac上,使用eclipse编写java,使用xcode运行c代码,xcode中可以使用gcc。
    课程是MOOC上JAVA相关课程
    (这里的compile.cmd文件可不关心,我用来存放,第四部步骤的相关命令的)
    在这里插入图片描述

    1. 编写带有native声明的方法的Java类

     use javah -cp bin jniSample we can get jniSample.h file.
    public class jniSample {
       //要在C中实现的方法sum。
    	public native int sum(int a, int b);
    	
    	public static void main(String[] args) {
    		//加载共享库文件libjniSample.jnilib文件。
    		System.loadLibrary("jniSample");
    		
    		jniSample sample = new jniSample();
    		int Sum = sample.sum(5, 6);
    		
    		System.out.println(Sum);
    	}
    }
    

    2. 使用javah 生成:jniSample.h的头文件

    use javah -cp bin jniSample we can get jniSample.h file.
    在终端,先切换到项目文件夹下:
    执行:

    javah -cp bin jniSample
    

    刷新项目:在eclipse中,右键项目,refresh即可。得到jniSample,该文件无需更改。

    /* DO NOT EDIT THIS FILE - it is machine generated */
    #include <jni.h>
    /* Header for class jniSample */
    
    #ifndef _Included_jniSample
    #define _Included_jniSample
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*
     * Class:     jniSample
     * Method:    sum
     * Signature: (II)I
     */
    JNIEXPORT jint JNICALL Java_jniSample_sum
      (JNIEnv *, jobject, jint, jint);
    
    #ifdef __cplusplus
    }
    #endif
    #endif
    

    3. 使用C实现本地sum方法:(这里我生成文件时候,误写了jinSample)。

    #include "jinSample.h"
    JNIEXPORT jint JNICALL Java_jniSample_sum
      (JNIEnv *env, jobject obj, jint num1, jint num2){
         return num1*num2;
      }
    
    void main(){}
    

    4. 将本地方法编写的文件生成动态链接库。

    mac下使用gcc生成动态链接库文件
    使用: 查看jdk路径

    /usr/libexec/java_home -V
    

    再将自己的jdk路径改下,以下是我的jdk路径。

    gcc -dynamiclib -I /Library/Java/JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/Home/include/ jinSample.c -o libjniSample.jnilib
    

    提示错误:

    /Library/Java/JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/Home/include/jni.h:45:10: fatal error: 
          'jni_md.h' file not found
    

    使用下列命令copy一份。在运行上述代码。

    sudo cp /Library/Java/JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/Home/include/darwin/jni_md.h /Library/Java/JavaVirtualMachines/jdk1.8.0_251.jdk/Contents/Home/include
    

    5. 再次刷新项目,再使用jniSample.java文件运行代码,得到结果。

    30
    

    注意:
    这里java文件中加载jniSample.jnilib文件。写的是"jniSample"。但是第四步骤中,写的是:libjniSample.jnilib。该名称前加上:lib。不如运行java代码调用本地sum方法时会报错。

    展开全文
  • 工作中涉及到的一个模块,使用JNI调用C写的dll,数据库是Oracle的,需要用到C写的头文件,明确参数类型等
  • java调用C语言的函数,对初学者很不错的实例! 在java调用C语言的函数,对初学者很不错的实例!
  • windows与linux环境下,java调用c语言的方法

    windows环境下,java调用c语言的方法

    1.环境

    • C语言编译器:工具比较多,本文使用的是gcc,带gcc的软件业比较丰富,我使用的是TDM-GCC, 注:网上很多使用的是MinGW,但我遇到了很多坑,最终在联想软件商店中下载的TDM-GCC,nice
    • java环境

    2.编写native方法java工具类,主要负责与本地native方法链接,不负责业务逻辑

    package com.xieshaoping.jni;
    
    /**
     * @author XieShaoping
     */
    public class NativeEntity {
    
        public native String getNativeMsg();
    
        public NativeEntity(String filename) {
            System.load(filename);
        }
    
    }
    
    

    3.编写调用native方法java的类,主要负责业务逻辑

    package com.xieshaoping.jni;
    
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    /**
     * @author XieShaoping
     */
    @RestController
    public class LoadlibraryController {
    
        @RequestMapping("loadlibrary")
        public String loadlibrary(String lib) {
            NativeEntity nativeEntity = new NativeEntity(lib);
            String msg = nativeEntity.getNativeMsg();
            System.out.println(msg);
            return msg;
        }
    
    }
    

    4.编译java生产class

    javac NativeEntity.java
    

    5.使用javah生成标头文件

    javah -jni com.xieshaoping.jni.NativeEntity
    

    注:直接输入javah -jni NativeEntity时会报错的,因为java有page的概念,需要在根目录下运行上述,命令

    此时生产了com_xieshaoping_jni_NativeEntity.h文件

    编写C语言

    #include<stdlib.h>
    #include<string.h>
    #include <stdio.h>  
    #include <math.h>
    #include <windows.h> //linux下,需要注释
    #include "com_xieshaoping_jni_NativeEntity.h"
    
    JNIEXPORT jstring JNICALL Java_com_xieshaoping_jni_NativeEntity_getNativeMsg(JNIEnv* env, jobject obj) //一定要与.h里的保持一致
    {
            //打印内容
            char *msg = "正在调用本地本地native方法-windows";
    	    printf(msg);
    	    //char * 转为jstring
    	    jclass strClass = (*env)->FindClass(env, "java/lang/String");
            jmethodID ctorID = (*env)->GetMethodID(env, strClass, "<init>","([BLjava/lang/String;)V");
            jbyteArray bytes = (*env)->NewByteArray(env, strlen(msg));
            (*env)->SetByteArrayRegion(env, bytes, 0, strlen(msg), (jbyte *) msg);
            jstring encoding = (*env)->NewStringUTF(env, "utf-8");
            return (jstring) (*env)->NewObject(env, strClass, ctorID, bytes, encoding);
    }
    
    

    7.gcc生成类库文件

    gcc -m64  -Wl,--add-stdcall-alias -I"D:\MyTool\Java\jdk1.8.0_251\include" -I"D:\MyTool\Java\jdk1.8.0_251\include\win32" -shared WindowsNative.c
    

    -m64 生成64位

    -o 命名,默认a.exe

    8.运行程序

    http://localhost:8080/loadlibrary?lib=D%3A%5CMyProject%5Cjni%5Csrc%5Cmain%5Cjava%5Ccom%5Cxieshaoping%5Cjni%5Ca.exe
    

    显示C语言方法输出的内容
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FAEftsBN-1646899518820)(img.png)]

    linux环境下,java调用c语言的方法

    与windows大部分相同, 不同处:

    • 删除“#include <windows.h>”
    • 添加java环境变量
    export JAVA_HOME=/root/jdk1.8.0_311
    export PATH=$PATH:$JAVA_HOME/bin
    export CLASSPATH=.:$JAVA_HOME/lib
    
    • gcc生成类库文件
    gcc -I"/root/jdk1.8.0_311/include" -I"/root/jdk1.8.0_311/include/linux" -fPIC -shared LinuxNative.c
    

    默认生成a.out文件

    运行成功
    在这里插入图片描述

    大功告成!

    附代码:
    https://gitee.com/xieshaoping/jni
    在这里插入图片描述

    展开全文
  • 要在java调用c语言的库,需要使用Java提供了JNI。举例说明在c语言中定义一个 void sayHello()函数(打印Hello World);然后在Java中调用这个函数显示Hello Word.现在分别从Java和C语言两部分说明:1. Java 部分首先...

    要在java中调用c语言的库,需要使用Java提供了JNI。

    举例说明

    在c语言中定义一个 void sayHello()函数(打印Hello World);然后在Java中调用这个函数显示Hello Word.

    现在分别从Java和C语言两部分说明:

    1. Java 部分

    首先定义一个HelloNative,在其中申明sayHello函数,函数要申明为Native 类型的.如下:

    public class HelloNative {

    public native void sayHello();

    }

    编译这个类,生成class文件:

    javac HelloWorld.java

    利用javah生成需要的h文件

    javah HelloNative

    生成的 h文件大概如下:

    /* DO NOT EDIT THIS FILE - it is machine generated */

    #include

    /* Header for class HelloNative */

    #ifndef _Included_HelloNative

    #define _Included_HelloNative

    #ifdef __cplusplus

    extern "C" {

    #endif

    /*

    * Class: HelloNative

    * Method: sayHello

    * Signature: ()V

    */

    JNIEXPORT void JNICALL Java_HelloNative_sayHello

    (JNIEnv *, jobject);

    #ifdef __cplusplus

    }

    #endif

    #endif

    可以看一下上面自动生成的程序,程序include了jni.h,这个头文件在 $JAVA_HOME下的include文件夹下. 还可以发现生成的函数名是在之前的函数名前面加上了Java_HelloNative。

    2. C语言部分

    根据上面生成的h文件编写相应的代码实现,建立一个 HelloNative.cpp用来实现显示Hello World的函数.如下:

    #include

    #include "HelloNative.h"

    JNIEXPORT void JNICALL Java_HelloNative_sayHello(JNIEnv *, jobject)

    {

    printf("Hello World!\n");

    }

    代码编写完成之后,我们再用gcc编译成库文件,命令如下;

    gcc -fPIC -I/usr/lib/jvm/java-7-openjdk-i386/include -I/usr/lib/jvm/java-7-openjdk-i386/include/linux -shared -o libHelloNative.so HelloNative.cpp

    这样就会在当前目录下生成一个libHelloNative.so的库文件.这时需要的库已经生成,在C语言下的工作已经完成了.

    接下来需要在Java中编写一个程序测试一下.在程序前,需要将我们的库载入进去.载入的方法是调用Java的 System.loadLibrary("HelloNative");

    public class TestNative

    {

    static {

    try {

    System.loadLibrary("HelloNative");

    }

    catch(UnsatisfiedLinkError e) {

    System.out.println( "Cannot load hello library:\n " + e.toString() );

    }

    }

    public static void main(String[] args) {

    HelloNative test = new HelloNative();

    test.sayHello();

    }

    }

    但是再编译后,运行的时候,问题又出现了.

    Cannot load hello library:

    java.lang.UnsatisfiedLinkError: no HelloNative in java.library.path

    Exception in thread "main" java.lang.UnsatisfiedLinkError: HelloNative.sayHello()V

    at HelloNative.sayHello(Native Method)

    at TestNative.main(TestNative.java:13)

    载入库失败,但是库明明就是放在当前文件夹下的,怎么会载入失败呢?

    用System.getProperty("java.library.path")查看,发现java.library.path中并不u存在当前的目录.主要有以下的几个解决办法:

    1) 将生成的库复制到java.library.path有的路径中去,当然这样不是很好

    2) 设置环境变量export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH ,将当前的目录加入到LD_LIBRARY_PATH中

    3) 设置java 的选项,将当前的目录加入到其中 .java -Djava.library.path=. $LD_LIBRARY_PATH

    这样之后程序就能够成功的运行了.可以看见显示的"Hello World!"了

    展开全文
  • 要在java调用c语言的库,一直觉得很不可思议,但是Java提供了JNI这个东西,这也就变得可能了. 作为一个码农,我们还是从最简单的 Hello World开始吧.首先说一下我们想要做的事情. 在c语言中定义一个 void sayHello()...
  • 大二java和数据结构都需要课程设计,想偷懒所以做了一个排序可视化的程序,javaC语言混合编程,两科都只用这一个课程设计就行了,嘿嘿 首先java要确定好那些类的那些方法是要用C语言写的,加上native class ...
  • 在linux下,java调用c语言编译的*.so动态链接库的小例子.是一个简单计算器的例子.在java中传操作数和操作符,由C来计算,把结果传过来给java.
  • PAGE / NUMPAGES glddydyzcw HU-unix下面java调用C语言动态链接库 我在Hpunix下面用java JNI怎么调用C语言的动态链接库 System.loadLibrary"helloWorld; ?C语言的动态链接库怎么生成需要修改什么配置也就是说java...
  • 这里写自定义目录标题背景知识本地代码历史原因本地代码的应用场景JNIJNI开发流程JNI头文件规则1...JAVA的早期阶段,很多人认为使用C和C++来加速JAVA应用中的关键部分是个好主意,但是实际上,虽然JAVA的代码确实没有纯
  • Java简单调用C语言函数

    千次阅读 2019-08-14 15:35:53
    Java简单调用C语言函数1.安装Dev-Cpp2.编写并编译Java代码3.新建工程4.修改C代码4.1将第2步生成的.h文件复制黏贴到dll.h里面4.2修改dllmain.cpp文件4.3 保存并编译4.4编译错误解决5.将编译好的dll文件放到java安装...
  • Java混合编程就是Java程序和其它应用程序进行通讯和数据交互,比如我们都知道c语言的计算性能要比Java的略好一些,所以Java程序可以调用c语言程序来进行一些比较耗时的计算工作,从而提高程序性能。 # JNI编程 例子...
  • Java调用C语言

    2014-04-28 13:39:04
    Java调用C语言 Java Native Interface(JNI)是Java语言的本地编程接口,是J2SDK的一部分。在java程序中,我们可以通过JNI实现一些用java语言不便实现的功能。通常有以下几种情况我们需要使用JNI来实现。 标准的...
  • 拉丁的传说要在java调用c语言的库,需要使用Java提供了JNI。举例说明在c语言中定义一个 void sayHello()函数(打印Hello World);然后在Java中调用这个函数显示Hello Word.现在分别从Java和C语言两部分说明:1. Java ...
  • Java JNI调用C语言中的函数

    千次阅读 2022-04-09 12:08:30
    1、调用无参函数 java code public class JNITest { static { /*加载*/ System.loadLibrary("mynative"); } public native static void JavaHello(); public static void main(String[] args) { ...
  • 通过Java调用OCX控件或者DLL有以下几种方法,使用JNI、JACOB、Jawin等技术完成接口调用; 1.JNI 最直接的方式,也是最麻烦的方式,需要自己完成所有的工作,不推荐。 2.Jawin 尝试了一下,效果不错,但相对来说...
  • C语言调用java语言的方法!对初学者很不错的实例!Android jni开发之C语言调用java语言
  • 为初步理解Java中native本地方法的使用,提出使用native方法实现计算任意正整数二进制的需求(native方法是Java中的本地方法,一般采用C/C++通过JNI(Java native interface)实现)。...6.运行java工程并调用JNI
  • 一、实现步骤 1)创建一个java类 2)用javac编译成class 3)用javah编译class生成.h文件 4)使用.h文件创建dll 5)执行.clss 6)完成
  • Java程序如何调用C/C++语言函数导语:我们可以利用C语言的强大功能实现Java难以实现的功能,在一定程序上消除Java的局限性和低效率。 下面就由小编为大家介绍一下Java程序如何调用C/C++语言函数,欢迎大家阅读!JNI是...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 129,187
精华内容 51,674
关键字:

java调用c语言

java 订阅
友情链接: sampesq.zip