系统环境: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的几种方法性能对比测试。 JNA消耗的总时间(ms):5406 bridj消耗的总时间(ms):984 JNI消耗的总时间(ms):47 包含c++源码和java源码,部署和使用方法。在win7和winxp下测试用过。 部分源码是...
javacv0.7+opencv2.4.8调用本地摄像头详细操作及测试代码,因为opencv2.4.8文件较大,本人无法上传还请见谅,给个百度云的下载地址http://pan.baidu.com/s/1o6imnUU,请各位自行下载
1、Dubbo 远程调用实现 2、内带zookeeper-3.4.5消息服务 3、直接导入myeclipse运行:dubbo-server导入tomcat中运行 4、dubbo-client 运行测试类/dubbo-client/src/com/fengjx/main/Consumer.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 ...
若是下载本地测试需要有修改,包中文件不一定全部用到
oracle insert数据成功之后调用触发器,触发器调用存储过程,存储实时调用java http
本程序实现了在web页面上,用JAVA的方式,调用扫描仪进行扫描,并上传至远程服务器。并且可以设置扫描范围、扫描精度、以及扫描UI显示等! 该版本在uploadpath参数设置为“http://localhost/xxx.action”,即使用...
本例子是通过httpClient 不断的去电信的网站查询可选手机新号 , 每次查出来的数据保存到map , 到一定数量以后 , 保存在本地文件中 , 测试类可以直接运行.Java工程,Maven实现
本程序实现了在web页面上,用JAVA的方式,调用扫描仪进行扫描,并上传至远程服务器。并且可以设置扫描范围、扫描精度、以及扫描UI显示等! 该版本在uploadpath参数设置为“http://localhost/xxx.action”,即使用...
java调用cmd命令实现访问windows共享目录(需不需要密码均可),然后根据指定文件路径下载文件到我们自己配置的本地目录,main函数为测试代码
HelloNativeTest.java 测试本地化是否成功的类文件 instanceVar.java 定义一个实例成员变量 invokeByObject.java 对象实参传递示例程序 invokeByValue.java 传值调用示例程序 invokeMethod.java 同一个类中调用...
常见的办法是通过本地工具(例如 Putty)连接远程计算机,输入命令执行,但是当遇到需要集成这些任务到代码或者开发、测试框架中时,往往就没有很好的解决方案了。sshxcute 就是这样一个框架工具集,它基于 JSCH ...
Java基于MCR的本地远程调用Matlab函数库源码+全部资料.zipJava基于MCR的本地远程调用Matlab函数库源码+全部资料.zip 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2...
mnist手写体的识别采用KNN算法,Java实现,60K训练集,10K测试集。代码主要包括读mnist数据集,KNN算法。
public class JVMine extends java.applet.Applet 简单实现!~ 网页表格组件 GWT Advanced Table GWT Advanced Table 是一个基于 GWT 框架的网页表格组件,可实现分页数据显示、数据排序和过滤等功能! Google Tag...
HTTP接口调用框架让 HTTP 接口调用跟调用本地方法一样自然优雅将 HTTP 请求和接口绑定,然后由框架生成接口的代理类,直接调用接口的方法就会自动构建请求参数并发送请求,然后处理请求响应转换为接口方法的返回值...
5个目标文件,演示Address EJB的实现,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口...
5个目标文件,演示Address EJB的实现,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口...
本地调试只要跑需要的一个微服务进行调试,其他服务都使用一套测试环境上的微服务,节省本地电脑的性能,节约资源。如,需要调用UC,本地只需要启动UC就可以联调。不影响其他人员正常使用测试环境查看页面,默认都是...