Java调用本地接口
先从一个经典例子说起,Java如何调用本地接口。
步骤如下:
1.创建HelloWorld.java
- class HelloWorld
- {
- static{
- System.loadLibrary("HelloWorld");
- }
- public native void myprint();
- public static void main(String[] args)
- {
- new HelloWorld().myprint();
- }
- }
2.编译生成Class文件HelloWorld
- >javac HelloWorld.java
3.生成文件头HelloWorld.h
- >javah -jni HelloWorld
4.C语言编写本地方法HelloWorld.c
- #include "HelloWorld.h"
- JNIEXPORT void JNICALL
- Java_HelloWorld_myprint(JNIEnv *env,jobject obj){
- printf("Hello World !\n");
- return;
- }
5.编译本地C方法生成类库dll文件或者so文件
- >gcc -Wl,--add-stdcall-alias -shared -Ic:\java\jdk1.6\include -Ic:\java\jdk1.6\include\win32 -o HelloWorld.dll HelloWorld.c
- 或者:
- >cl -Ic:\Java\jdk1.6\include -Ic:\Java\jdk1.6\include\win32 -LD HelloWorld.c -FeHelloWorld.dll
- 如果没有c的编译环境需要安装编译环境或者gcc 参数:-I接目录位置,中间无需空格
- ★关键 dll文件需要存放到 jdk的bin目录或者system32下面
6.测试HelloWorld
- >java HelloWorld
- 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调用本地接口的更多相关文章
- Java调用本地接口:java.lang.UnsatisfiedLinkError
Java调用本地接口:java.lang.UnsatisfiedLinkError 我的问题不在这篇文章描述中, 而是因为jni原来是c实现, 现在切换到cpp了, 需要在对应的cpp文件中加入ext ...
- Android使用JNI(从java调用本地函数)
当编写一个混合有本地C代码和Java的应用程序时,需要使用Java本地接口(JNI)作为连接桥梁.JNI作为一个软件层和API,允许使用本地代码调用Java对象的方法,同时也允许在Java方法中调用本 ...
- [JNI] Java 调用 C++ dll
首先介绍一下JNI吧! JNI 是Java提供的一个用于调用本地接口的接口层,位于Java代码 和 本地代码之间的一层:主要功能是 数据类型的转换,还有就是通过这一层来调用本地代码! 下面就说说Jav ...
- java调用C++的过程
转自https://blog.csdn.net/yjhdxflqm/article/details/50503551 jni是java和C.C++通信的桥梁. java适合写上层的应用,C.C++适合 ...
- 基于 Android NDK 的学习之旅-----Java 调用C
随便谈谈为什么要Java调用C 吧: 我认为: 1. 有些公司开发Android项目的时候, 许多组件功能可能是C中已经实现了,所以我们没必要同样的功能又在java中实现一遍.例如我之前做的一个项目 ...
- JAVA调用 keytool 生成keystore 和 cer 证书
keytool是一个Java数据证书的管理工具, keytool将密钥(key)和证书(certificates)存在一个称为keystore的文件中在keystore里, 包含两种数据: 密钥实体( ...
- java调用mysql服务做备份与恢复
首先添加mysql的bin到环境变量,这样可以简写部分命令,并且做到不依赖系统mysql的具体安装路径. 重启计算机可以让添加的环境变量在java代码中调用时生效.(cmd中生效但java中调用没有生 ...
- 存储过程详解与java调用(转)
存储过程的一些基本语法: --------------创建存储过程----------------- CREATE PROC [ EDURE ] procedure_name [ ; number ] ...
- c++ c# java 调用 c++ 写的dll
1. vs 中新建win32 dll 项目 testdll 添加实现文件 test.cpp #include "stdafx.h" #include <ios ...
随机推荐
- Linux设置开机服务自动启动
[root@localhost ~]# chkconfig --list 显示开机可以自动启动的服务[root@localhost ~]# chkconfig --add *** 添加开机自 ...
- Javascript和HTML dom
今天在看DOM那一章的时候突然想到一个问题,众所周知的js的数据类型有两种:原始类型和对象类型.其中原始类型又包括以下几种类型:数字型.字符串型.布尔值.null和undefined.其中对象类型包括 ...
- 查看当前目录每个文件的大小(linux)
du -sh * 查看当前目录每个文件的大小
- 【Machine Learning in Action --2】K-近邻算法构造手写识别系统
为了简单起见,这里构造的系统只能识别数字0到9,需要识别的数字已经使用图形处理软件,处理成具有相同的色彩和大小:宽高是32像素的黑白图像.尽管采用文本格式存储图像不能有效地利用内存空间,但是为了方便理 ...
- 还在纠结 Flux 或 Relay,或许 Redux 更适合你
重磅消息,Redux 1.0 发布,终于可以放心用于生产环境了! 在这个端应用技术膨胀的时代,每天都有一大堆框架冒出,号称解决了 XYZ 等一系列牛 X 的问题,然后过一段时间就不被提起了.但开发的应 ...
- 打开另外一个App
/** * 打开一个app * * @param packageName * @param data * @return */ public static boolean lanuchApp(Cont ...
- strictmode
最新的Android平台中(Android 2.3起),新增加了一个新的类,叫StrictMode(android.os.StrictMode).这个类可以用来帮助开发者改进他们编写的应用,并且提供了 ...
- WinForm 子窗体在父窗体范围内移动,不能出父窗体 摘自于网络
详细解释:1, 主窗体Form1属性IsMdiContainer设为True,并添加ToolStrip控件, Toolstrip中添加一个按钮toolStripButton1. 2,添 ...
- 如果更新包更新包现场,class文件更新过去,没有改变,及时删掉,照样能进那个模块的问题。
这是打更新包需要注意的问题: 带$的同名文件也需要copy过来打更新包,不能只更新一个class文件,找了1天的错误,简直日乐购.
- POJ1734/Floyd求最小环
Sightseeing trip Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6647 Accepted: 2538 ...