zoukankan      html  css  js  c++  java
  • java实现调用c接口

     我们经常在java中去调用c接口,这是因为时常会有用java实现较难但用c实现较为简单的功能,所有这个时候我们需要编写相关代码实现在java中调用c,如下示例:

           1),java文件 JavaCallC.java

               

         2)在C语言中实现上述要在C接口中实现的方法:

                如: public native int StrInIntOut(String str);

               步骤为:

    •           执行命令: javac JavaCallC.java 和javah JavaCallC (注意这里的java文件在默认的包下,非自定义包)
    •          对上述命令生成的文件JavaCallC.h(头文件),该程序需要被C/C++程序调用生成所需的类文件
    •          对于已生成的.h头文件,C/C++所需要做的,就是把它的各个方法具体的实现。然后编译连接成库文件(dll文件)即可。再把库文件拷贝到JAVA程序的路径下面,就可以用JAVA调用C/C++所实现的功能了

          下为生成的.h文件:

             

         c语言中实现如下:

         (A) 新建空工程 

      在VS中新建工程:Win32 Console Application,取名“JavaCallC”,选择空工程。新建后修改工程属性: 

      (1) General中,将“Configuration Type”改为“Dynamic Library (.dll)”; 

      (2) C/C++的General中,将“Additional Include Directories”添加两项: 

      “C:Program FilesJavajdk1.5.0_06include” 

      “C:Program FilesJavajdk1.5.0_06includewin32” 

      根据你安装的JAVA路径而设置,这是因为在C/C++编译过程中要使用JAVA的jni.h等文件 
        
          (B)将上面生成的JavaCallC.h添加入工程           

          (C)新建一个新的文件JavaCallC.cpp,代码 省略

          (D)按F7编译链接,生成JavaCallC.dll文件

          (E)将JavaCallC.dll复制到与使用DLL的JAVA文件相同的目录下

          (F)启动Main函数执行

     

    总结: 

      另外,JAVA与DLL函数的参数传递过程,像int类型的,可以直接从JNI函数参数列表中获取;而数组元素则要通过JNIEnv来获取: 

      jbyte *buffer = (*env).GetByteArrayElements(str, 0); // str是参数列表中jbyteArray变量 

      同理可以获取char[]的元素。 

      函数返回时,可以直接用return语句返回。也可以设置参数列表中的变量指针来返回: 

      (*env).SetByteArrayRegion(byteArray, 0, 128, byteArr); 

      byteArray是参数列表中的jbyteArray变量,作为指针用来返回需要返回的信息;byteArr是jbyte*类型,里面存放的值是要返回的内容。 

      其它的信息可以从Google或Baidu中通过查找“jni”或“java调用DLL”来查阅到。

  • 相关阅读:
    python——集合
    python——字典
    python——用递归的方法求x的y次幂
    python——全局变量&局部变量
    python——组织列表
    Linux显示网络相关信息
    Linux里的发消息
    Linux中各种压缩文件
    Linux中的man
    Linux的find命令
  • 原文地址:https://www.cnblogs.com/xuhn/p/2612061.html
Copyright © 2011-2022 走看看