Java调用本地接口

先从一个经典例子说起,Java如何调用本地接口。

步骤如下:

1.创建HelloWorld.java

[java] view plaincopy

  1. class HelloWorld
  2. {
  3. static{
  4. System.loadLibrary("HelloWorld");
  5. }
  6. public native void myprint();
  7. public static void main(String[] args)
  8. {
  9. new HelloWorld().myprint();
  10. }
  11. }

2.编译生成Class文件HelloWorld

[plain] view plaincopy

  1. >javac HelloWorld.java

3.生成文件头HelloWorld.h

[plain] view plaincopy

  1. >javah -jni HelloWorld

4.C语言编写本地方法HelloWorld.c

[cpp] view plaincopy

  1. #include "HelloWorld.h"
  2. JNIEXPORT void JNICALL
  3. Java_HelloWorld_myprint(JNIEnv *env,jobject obj){
  4. printf("Hello World !\n");
  5. return;
  6. }

5.编译本地C方法生成类库dll文件或者so文件

[plain] view plaincopy

  1. >gcc -Wl,--add-stdcall-alias -shared -Ic:\java\jdk1.6\include -Ic:\java\jdk1.6\include\win32 -o HelloWorld.dll HelloWorld.c

[plain] view plaincopy

  1. 或者:
  2. >cl -Ic:\Java\jdk1.6\include -Ic:\Java\jdk1.6\include\win32 -LD HelloWorld.c -FeHelloWorld.dll

[plain] view plaincopy

  1. 如果没有c的编译环境需要安装编译环境或者gcc 参数:-I接目录位置,中间无需空格

[plain] view plaincopy

  1. ★关键 dll文件需要存放到 jdk的bin目录或者system32下面

6.测试HelloWorld

[java] view plaincopy

  1. >java HelloWorld
  2. Hello World !

这个经典小例子一般在命令行下面没有什么问题,容易出错的地方就是dll 存放位置不对。运行的时候无法加载dll。

常见错误:

       1. java.lang.UnsatisfiedLinkError: no HelloWorld in java.library.path

       2. Exception in thread "main" java.lang.UnsatisfiedLinkError: xxx.xxx.HelloWorld.myprint()V

网上总结很多。错误1,主要是没有办法path路径中加载。错误2主要是没有myprint方法,类库加载没有问题。

排除dll本身问题(网上不少人遇到),dll没有问题,加载路径也没有问题,不能连接到方法。这个在命令行的时候不容易发现问题,移到生产环境中容易出现,可能你已经猜到了,HelloWorld.java包路径,类的包路径要和生成头文件类包路径一致

http://www.360doc.com/content/09/0402/09/107226_2994393.shtml

Java调用本地接口

时间: 2024-10-12 14:25:18

Java调用本地接口的相关文章

Android使用JNI(从java调用本地函数)

当编写一个混合有本地C代码和Java的应用程序时,需要使用Java本地接口(JNI)作为连接桥梁.JNI作为一个软件层和API,允许使用本地代码调用Java对象的方法,同时也允许在Java方法中调用本地函数. 在Java端,开发者所需要做的仅仅是在连接本地函数的方法之前加上native关键字.这样VM就会去寻找这个本地函数. 1.从Java调用本地函数 从Java调用本地函数时,需要在类中定义一个带有native关键字的特有方法,作为连接本地代码的桥梁.通过这个定义,尝试调用本地方法时JVM会找

[JNI] Java 调用 C++ dll

首先介绍一下JNI吧! JNI 是Java提供的一个用于调用本地接口的接口层,位于Java代码 和 本地代码之间的一层:主要功能是 数据类型的转换,还有就是通过这一层来调用本地代码! 下面就说说Java 调用 C++  dll是怎么实现的吧! 1.首先用Java代码制作接口层 package NEU.SOFT; public class NEUdll { public NEUdll() { } //供Java调用的本地代码 public native char[] Descrypt(boolea

Java调用WebService 接口 实例

这里给大家介绍一下,Java调用webservice的一个实例的过程. 本项目不能运行,因为接口地址不可用. 这里只是给大家介绍一个过程,同时留作自己的笔记.如果要学习,可以参照别人的实例.比较好. ①选择项目根目录的src ,右键,new --> webservice client 然后输入地址: http://172.18.100.52:456/hello?wsdl 必须要加wsdl结尾,这样才是一个webservice的接口. finlish.这时候刷新项目.可以看到项目下/src/com

java 调用 keytool 生成keystore 和 cer 证书

keytool是一个Java数据证书的管理工具, keytool将密钥(key)和证书(certificates)存在一个称为keystore的文件中在keystore里, 包含两种数据: 密钥实体(Key entity)——密钥(secret key)又或者是私钥和配对公钥(采用非对称加密) 可信任的证书实体(trusted certificate entries)——只包含公钥 ailas(别名)每个keystore都关联这一个独一无二的alias,这个alias通常不区分大小写 下面给出一

java调用phantomjs采集ajax加载生成的网页

java调用phantomjs采集ajax加载生成的网页 日前有采集需求,当我把所有的对应页面的链接都拿到手,准备开始根据链接去采集(写爬虫爬取)对应的终端页的时候,发觉用程序获取到的数据根本没有对应的内容,可是我的浏览器看到的内容明明是有的,于是浏览器查看源代码也发觉没有,此时想起该网页应该是ajax加载的.不知道ajax的小朋友可以去学下web开发啦. 采集ajax生成的内容手段不外乎两种.一种是通过http观察加载页面时候的请求,然后我们模仿该请求去得到对应的内容,第二种则是模仿浏览器行为

Java调用Linux命令(cd的处理)

一.Java调用Linux系统的命令非常简单 这是一个非常常用的调用方法示例: 1 public String executeLinuxCmd(String cmd) { 2 System.out.println("got cmd job : " + cmd); 3 Runtime run = Runtime.getRuntime(); 4 try { 5 Process process = run.exec(cmd); 6 InputStream in = process.getIn

JAVA调用Shell脚本

在实际项目中,Java有时候需要调用C写出来的东西,除了JNI以外,我认为一种比较好的方法是JAVA调用Shell.先把C写出来的make成可执行文件,然后再写一个shell脚本执行该可执行文件,最后是JAVA调用该shell脚本. JAVA调用很简单,例子如下: 首先是shell脚本 [plain] view plain copy print? #!/bin/sh echo Begin word cluster /home/felven/word2vec/word2vec -train /ho

ndk学习17: jni之Java调用C&C++

一.Hello World 1. 定义函数原型 native关键字定义的函数即为jni函数 2.生成头文件 切换到src目录执行: (这个过程可以写脚本自动完成,比如自动拷贝到jni目录) javah -jni 包名.类名 在根目录下生成: org_bing_testjni_MainActivity.h 3. 工程中添加jni代码 工程右键->添加native code->输入名字->finish 多了如下文 新建一个Application.mk,配置相关选项(详细查看ndk有关Appl

java调用c++ dll出现中文乱码

最近的开发用到了使用java调用本机动态连接库的功能,将文件路径通过java调用C++代码对文件进行操作.在调用中如果路径中包含有中文字符就会出现问题,程序运行就会中止.下面用一个小例子,来说明记录下解决的方法. java中传入一个字符串,调用c++代码将字符串输出 public class CommonUtil { static { System.loadLibrary("nativeTest"); } public native static void Print(String s