`
buzuibuxiu
  • 浏览: 61311 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java调用本地方法简单测试

 
阅读更多
系统环境:Linux  CentOs5
Java平台:JDK1.6.0_27
本地方法:使用C语言,gcc编辑器


这里只是一个简单的描述,其目的只是为了调用本地方法这个过程的跑通,所以一切从简!

过程步骤:
           1.编写Java类文件,包含本地方法声明以及调用本地方法的main方法。
           2.使用javac 编译Java类文件,与正常编译方式一样。
           3.使用javah -jni来根据编译后的class文件生成本地方法声明的.h头文件。
           4.编写本地方法的实现C文件,其中包含第三步中生成的.h头文件。
           5.gcc -c 编译C语言文件。
           6.gcc -shared -o libNativeFile.so NativeFile.o,根据第五步编译生成的o文件来生成库文件即so文件,该文件名前面要多添加一个lib。



具体操作步骤如下:

       编写TestNative.java如下:
       public class TestNative{

           private native void sayHello();    //声明本地方法
           static{
              System.loadLibrary("NativeFile"); //加载库文件,这里只写NativeFile,将前面的lib前缀省略。
           }

           public static void main(String[] args){
              
              TestNative theNative = new TestNative();
              theNative.sayHello();              //调用其声明的本地方法
           }
       }

      这个java文件就算完成了。

      执行: javac TestNative.java        即可,生成.class文件。

      执行: javah -jni TestNative        即可,生成TestNative.h

      打开TestNative.h,内容如下

      
      /* DO NOT EDIT THIS FILE - it is machine generated */
       #include <jni.h>
      /* Header for class TestNative */

       #ifndef _Included_TestNative
       #define _Included_TestNative
       #ifdef __cplusplus
       extern "C" {
       #endif
       /*
        * Class:     TestNative
        * Method:    sayHello
        * Signature: ()V
        */
       JNIEXPORT void JNICALL Java_TestNative_sayHello
         (JNIEnv *, jobject);

       #ifdef __cplusplus
       }
       #endif
       #endif
      



     这里面包含着一个方法的声明,但是已经与我们开始在java文件里面的声明完全不同。

     下一步我们新建一个NativeMethod.c文件,其内容如下:


     

        #include <stdio.h>
        #include <stdlib.h>
        #include <jni.h>

        #include "TestNative.h"


        JNIEXPORT void JNICALL Java_TestNative_sayHello(JNIEnv *env, jobject this)
        {

           printf("hello zhangsan");

         }
      



      这里面实现的就是那个头文件里面的方法,注意要完全一样,方法名是Java_TestNative_sayHello,Java首字母大写,本人在调试时就犯了这个无聊的错误耽误了不少的时间

      然后: gcc -c NativeMethod.c
       
      得到一个o文件

      然后: gcc -shared -o libNativeMethod.so NativeMethod.o

      就能够得到一个以so结尾的库文件。

      然后就是最后一步了,设置路径,方式应该有不少种方法。
        1.可以在/etc/bashrc里面添加如下(未试过):
               export LD_LIBRARY_PATH=/home/chengshu/java

        2.在/etc/profile文件中添加(也未试过,本人比较懒!)
               LD_LIBRARY_PATH=/home/chengshu/java

        3.直接在linux控制台执行(我喜欢!):export LD_LIBRARY_PATH=/home/chengshu/java

        4.在执行最后的class文件的时候指定,即:
            java -Djava.library.path=. TestNative

     解释一下,这个/home/chengshu/java路径即我们的so文件所在的路径,我一直在该目录下工作,所以在上面的第四种方法的时候直接指定为"."即是当前目录,so文件即在下面。

      一切都大功告成了,执行程序!!!

      执行命令可以参看:java TestNative
      或者:            java -Djava.library.path=. TestNative


      即可得到输出:zhangsan hello


添加:有时候java程序需要使用一些jar包,则需要在mf文件里面配置:
Class-Path: jar/jpcap.jar  注意:":"之后必须有一个空格,后面路径是相对于执行jar包而言的。搞错了,这是对上一篇文章的补充!

   
     
分享到:
评论

相关推荐

    java调用本地dll的几种方法性能对比测试

    java调用本地dll的几种方法性能对比测试。 JNA消耗的总时间(ms):5406 bridj消耗的总时间(ms):984 JNI消耗的总时间(ms):47 包含c++源码和java源码,部署和使用方法。在win7和winxp下测试用过。 部分源码是...

    javacv0.7+opencv2.4.8调用本地摄像头详细

    javacv0.7+opencv2.4.8调用本地摄像头详细操作及测试代码,因为opencv2.4.8文件较大,本人无法上传还请见谅,给个百度云的下载地址http://pan.baidu.com/s/1o6imnUU,请各位自行下载

    Dubbo 实现远程调用

    1、Dubbo 远程调用实现 2、内带zookeeper-3.4.5消息服务 3、直接导入myeclipse运行:dubbo-server导入tomcat中运行 4、dubbo-client 运行测试类/dubbo-client/src/com/fengjx/main/Consumer.java

    JNI技术手册 c/c++调用java

    II. java c/cpp互相调用实例(姊妹篇之一)——java调用c/cpp 4 一 先制作一个系统中有的DLL文件(cpp给出的sdk接口) 4 二 JNI 7 1、 编写java文件 7 2、 生成.h头文件 8 3、 用c/cpp实现这个头文件 9 三 测试 10 ...

    java使用jacob包调用bartender软件自定义行列数批量打印标签

    若是下载本地测试需要有修改,包中文件不一定全部用到

    oracle 触发器实时调用java 中http接口

    oracle insert数据成功之后调用触发器,触发器调用存储过程,存储实时调用java http

    WEB调用扫描仪完全功能本地版

    本程序实现了在web页面上,用JAVA的方式,调用扫描仪进行扫描,并上传至远程服务器。并且可以设置扫描范围、扫描精度、以及扫描UI显示等! 该版本在uploadpath参数设置为“http://localhost/xxx.action”,即使用...

    httpClient调用远程接口获取数据到本地文件夹

    本例子是通过httpClient 不断的去电信的网站查询可选手机新号 , 每次查出来的数据保存到map , 到一定数量以后 , 保存在本地文件中 , 测试类可以直接运行.Java工程,Maven实现

    javatwain 使用扫描仪

    本程序实现了在web页面上,用JAVA的方式,调用扫描仪进行扫描,并上传至远程服务器。并且可以设置扫描范围、扫描精度、以及扫描UI显示等! 该版本在uploadpath参数设置为“http://localhost/xxx.action”,即使用...

    超详细!java访问windows共享目录并下载文件

    java调用cmd命令实现访问windows共享目录(需不需要密码均可),然后根据指定文件路径下载文件到我们自己配置的本地目录,main函数为测试代码

    Java开发技术大全(500个源代码).

    HelloNativeTest.java 测试本地化是否成功的类文件 instanceVar.java 定义一个实例成员变量 invokeByObject.java 对象实参传递示例程序 invokeByValue.java 传值调用示例程序 invokeMethod.java 同一个类中调用...

    Java 调用 Linux shell 命令执行框架:sshxcute

    常见的办法是通过本地工具(例如 Putty)连接远程计算机,输入命令执行,但是当遇到需要集成这些任务到代码或者开发、测试框架中时,往往就没有很好的解决方案了。sshxcute 就是这样一个框架工具集,它基于 JSCH ...

    Java基于MCR的本地远程调用Matlab函数库源码+全部资料.zip

    Java基于MCR的本地远程调用Matlab函数库源码+全部资料.zipJava基于MCR的本地远程调用Matlab函数库源码+全部资料.zip 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2...

    mnist手写体的识别采用KNN算法,Java实现

    mnist手写体的识别采用KNN算法,Java实现,60K训练集,10K测试集。代码主要包括读mnist数据集,KNN算法。

    java开源包1

    public class JVMine extends java.applet.Applet 简单实现!~ 网页表格组件 GWT Advanced Table GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag...

    http-api-invoker:一个让http接口调用跟调用本地方法一样自然优雅的项目

    HTTP接口调用框架让 HTTP 接口调用跟调用本地方法一样自然优雅将 HTTP 请求和接口绑定,然后由框架生成接口的代理类,直接调用接口的方法就会自动构建请求参数并发送请求,然后处理请求响应转换为接口方法的返回值...

    JAVA上百实例源码以及开源项目

    5个目标文件,演示Address EJB的实现,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口...

    JAVA上百实例源码以及开源项目源代码

    5个目标文件,演示Address EJB的实现,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口...

    微服务本地调试指南V1.3_20200113140432.pdf

    本地调试只要跑需要的一个微服务进行调试,其他服务都使用一套测试环境上的微服务,节省本地电脑的性能,节约资源。如,需要调用UC,本地只需要启动UC就可以联调。不影响其他人员正常使用测试环境查看页面,默认都是...

Global site tag (gtag.js) - Google Analytics