当前位置:  编程技术>java/j2ee

java jni调用c函数实例分享(java调用c函数)

    来源: 互联网  发布时间:2014-10-30

    本文导语:  从C/C++到Java,再从Java回到C/C++,今天终于有机会了解了连接Java、C/C++的桥梁——JNI。哈哈!分享一下! 一、简介JNI是Java native interface的简写,可以译作Java原生接口。Java可以通过JNI调用C/C++的库,这对于那些对性能要求比较高...

从C/C++到Java,再从Java回到C/C++,今天终于有机会了解了连接Java、C/C++的桥梁——JNI。哈哈!分享一下!

一、简介
JNI是Java native interface的简写,可以译作Java原生接口。Java可以通过JNI调用C/C++的库,这对于那些对性能要求比较高的Java程序或者Java无法处理的任务无疑是一个很好的方式。

二、目的:Java代码中调用C/C++代码
三、实现:假设我们的Java程序为J2C.java, C程序为J2C.c, Java与C之间的通信函数名为write2proc;
              那么write2proc的声明位于J2C.java,实现位于J2C.c;
四、操作
1. 编写并编译Java程序

    javac J2C.java => J2C.class
2. 生成C/C++头文件

    javah J2C => J2C.h (安装JDK后,$JAVA_HOME应该已加入$PATH, 否则使用绝对路径,例如/usr/bin/javah)

3. 编写对应的C/C++程序:J2C.c

4. 生成C/C++目标文件
    gcc -I/usr/lib/jvm/java-6-openjdk-amd64/include -I/usr/lib/jvm/java-6-openjdk-amd64/include/linux -fPIC -c J2C.c => J2C.o
5. 生成C/C++共享库

    gcc -shared -Wl,-soname,libj2c.so.1 -o libj2c.so.1.0 J2C.o => libj2c.so.1.0

6. 重命名cp libj2c.so.1.0 libj2c.so => libj2c.so

7. 将共享库加入动态链接库的路径(此例为当前目录)
    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.

8. 执行Java程序,实现跨语言通信
     java J2C

 

五、具体过程

1. 编写并编译J2C.java

代码如下:

import java.lang.management.ManagementFactory;
import java.lang.management.RuntimeMXBean;

public class J2C
{
     static
     {
          try{
               // 此处即为本地方法所在链接库名
               System.loadLibrary("j2c");
          } catch(UnsatisfiedLinkError e)
          {
               System.err.println( "Cannot load J2C library:n " +
               e.toString() );
          }
     }

     //声明的本地方法
     public static native int write2proc(int pid);

     public static void main(String[] args){

          //获取本进程(即主线程)的pid
          final RuntimeMXBean runtime = ManagementFactory.getRuntimeMXBean();
          final String info = runtime.getName();
          final int index = info.indexOf("@");


          if (index != -1) {
               final int pid = Integer.parseInt(info.substring(0, index));
               System.out.println(info);
               System.out.println(pid);

               write2proc(pid);
          }


          try{
               Thread.sleep(8000);
          } catch(InterruptedException e){
               e.printStackTrace();
          }
     }
}

note:Java程序中System.loadLibrary参数名表示要载入的C/C++共享库,第6步生成的共享库名必须与该参数一致,即System.loadLibrary(Name) 对应共享库名libName.so (共享库名必须以lib开头)

2. 生成C头文件J2C.h:javah J2C

代码如下:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include
/* Header for class J2C */

#ifndef _Included_J2C
#define _Included_J2C
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class: J2C
 * Method: write2proc
 * Signature: (I)I
 */
JNIEXPORT jint JNICALL Java_J2C_write2proc
     (JNIEnv *, jclass, jint);

#ifdef __cplusplus
}
#endif
#endif

note:1. 头文件自动生成,不要修改它;

2. 函数JNIEXPORT jint JNICALL Java_J2C_write2proc(JNIEnv *, jclass, jint);

 按照注释的说明是在J2C.java文件的类J2C的方法write2proc处定义,故C程序的实现函数必须与该处签名一致;

3. 编写C程序J2C.c

代码如下:

#include

#include "J2C.h"

JNIEXPORT int JNICALL Java_J2C_write2proc(JNIEnv * env, jobject arg, jint pid)
{

     printf("current pid is %dn", pid);

     return 0;

}

4. 编译C程序

因为C程序里#include "J2C.h"而J2C.h又#include , 而gcc里面默认环境并不知道jni.h是什么东西,故编译时需要告诉编译器jni.h的位置( jni.h在jdk 的$JAVA_HOME/include下面),所以才有了上面的编译参数;

因为使用gcc编译得到动态库,在jni调用的时候,某些情况会有异常, 可尝试改用g++。

总结

1. Java中方法的原型声明与C/C++对应的实现文件定义必须一致(可以通过自动生成的C/C++头文件来比较),尤其是类名和方法名;

2. Java中System.loadLibrary()载入的共享库名必须与后面C/C++生成的共享库名一致。


    
 
 

您可能感兴趣的文章:

  • VB编写的DLL不能被JAVA调用,用C将VB编写的DLL包装起来,做成一个新的DLL;用C编写的DLL可以被JAVA调用,用JAVA再进行一层的包装,因为JAV
  • 请问从一个java程序中如何调用另一java程序,并控制可以其状态(最小化、最大化、结束程序),还有怎样知道那个被调用的程序结束。
  • 可不可以用java调用其他语言的编译结果?(好象asp调用com那样)
  • 请问如何在Java中调用一个VB所写的DLL?如何调用这个Dll的方法?如何取得和设置这个Dll的属性值?谢谢!
  • ###java调用COM组件或COM调用java组件(EJB)解决办法。###
  • java线程怎么调用java的application.class?
  • 求救!!如何在java程序中调用外部非java的exe文件?
  • 急!请问有分析java程序性能瓶颈的工具吗?例如,统计 java 程序中函数调用次数?
  • java.awt 和java.util都有List,想调用awt的List而出现Ambiguous class错误怎么办?
  • 一个.java文件中怎样来调用另一个.java文件中的变量及其它东西!
  • java调用sh脚本遇到export命令会卡住,sh不能调用子sh
  • Java能调用OLE对象吗?怎样利用Java生成Excel报表?
  • java打包后如何调用?
  • 请问Java可否调用MsSQL的存储过程,如何调用?
  • 奇怪?我在jsp中调用java类。java类本身编译没错,但jsp中的引用Tomcat总是报错。
  • java能否调用dll或ocx
  • 如何用java调用word?来者给分!·!!!!!
  • 怎么在java里调用一个oracle的procedure呢?
  • 我在APPLET里调用JAVAMAIL发邮件,出现java.security.AccessControlException: access denied (java.util.PropertyPermission * read,write)的错误???
  • 求教!!!VC应用调用Java模块可行吗?
  • java的数学函数在那个类中,如幂函数、指数、对数、双曲线函数等?
  • 怎样用JAVA函数读写注册表,有这样的函数吗
  • java 的条件判断函数(类似于别的语言iif函数)
  • PHP中的Pack()函数,Java有哪个函数与之对应???
  • JAVA中函数调用时,能不能向 C/C++一样函数的入口参数可以为传出值(就是引用,或指针)
  • 请问在JAVA里将小写字母换为大写字母是用什么函数,大写转成小写又是用哪个函数?
  • java里有什么函数可以检查 java 代码并执行它?
  • 谁能告诉我,在JAVA中,哪个函数和ASP中的Int()函数等同,也就是取整函数
  • java类中的方法就是函数了,函数参数全是传值了,传址参数怎样表示?
  • 虚函数与纯虚函数(C++与Java虚函数的区别)的深入分析
  • Java中有不有与VB中Replace函数功能类似的函数?
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • java Servlet获取和设置cookie实例代码
  • 万般火急!关于java打印,已经得到printerJob实例,那么怎么通过它得到Pageable实例?
  • 可以有其他两个类的实例同时调用一个java实例的两个方法吗?
  • <java技术手册>与<java实例技术手册>这两本书怎么样?
  • Java单例模式实例简述
  • 寻求java加密算法及实例
  • Java能调用OLE对象吗?怎样利用Java生成Excel报表? iis7站长之家
  • 请问哪里有《java实例技术手册》的电子书下载?100分赠送!
  • 请教:JAVA中说什么类的实例,那是怎么样的一个概念呢?
  • java实现大数加法(BigDecimal)的实例代码
  • Java究竟能干些什么呢?清高手们列举一些实例出来,跟帖有分.
  • java HashMap的keyset实例
  • java获取当前日期使用实例
  • java之super关键字用法实例解析
  • Java调用DOS实现定时关机的实例
  • java结束进程的实例代码
  • 急!大家谁有类似visio的java实例或代码?
  • java 如何获取对象实例的大小
  • 高分火速求解,请在线朋友回答:java自定义类怎样生成实例数组?( className[] N=new className[X];怎么不行?)
  • 刚学java想试编一个文本编辑器,各位能不能给推荐一些较好的参考程序或实例
  • Java位运算和逻辑运算的区别实例
  • java命名空间java.sql类types的类成员方法: java_object定义及介绍
  • 我想学JAVA ,是买THINK IN JAVA 还是JAVA2核心技术:卷1 好???
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: imageflavor定义及介绍
  • 请问Java高手,Java的优势在那里??,Java主要适合于开发哪类应用程序
  • java命名空间java.lang.management类managementfactory的类成员方法: getcompilationmxbean定义及介绍
  • 如何将java.util.Date转化为java.sql.Date?数据库中Date类型对应于java的哪个Date呢
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getlibrarypath定义及介绍
  • 谁有电子版的《Java编程思想第二版(Thinking in java second)》和《Java2编程详解(special edition java2)》?得到给分
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getstarttime定义及介绍
  • 本人想学java,请问java程序员的待遇如何,和java主要有几个比较强的方向


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3