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”来查阅到。

原文地址:https://www.cnblogs.com/xuhn/p/2612061.html