java jni 编程
最近要学习Java JNI 编程.
我使用的是的windows系统。装了一个cygwin.
根据 《JNI 编程规范和指南》. 文件网址: http://wenku.baidu.com/view/b52878ffaef8941ea76e0531.html
第一步: javac HelloWorld.java 生成了 HellWorld.class // 在cygwin 下执行命令
第二步:javah -jni HelloWorld 生成了HelloWorld.h // 在cygwin 下执行命令
第三步:实现HelloWorld.c 这个文件 //用文本编译器写上代码
第四步:生成HelloWorld.dll 这个文件,由于是在windows 系统所以要生成.dll文件。而不是 libHelloWorld.so 文件。
一开始,我一直在cygwin下用 gcc -shared HelloWorld.c libHelloWorld.so 生成了 libHelloWorld.so ,但在运行时
执行 java HelloWorld 时
总是出下面的错误,我以为是cygwin 下是找HelloWorld.so的,其实是找HelloWorld.dll的.
java.lang.UnsatisfiedLinkError: no HelloWorld in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1700)
at java.lang.Runtime.loadLibrary0(Runtime.java:841)
at java.lang.System.loadLibrary(System.java:1067)
at HelloWorld.<clinit>(HelloWorld.java:7)
Error: Could not find the main class.
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main"
老说链接不了本地方法的库.
于是我就用,命令行编译生成 HelloWorld.dll文件。但是老是编译通不过,生成不了HelloWorld.dll于是。
我就用vc6 生成了 Helloworld.dll.
打开VC6,: 文件--->新建-->win32 Dynamic-Link Library 选择新建一个动态链接库
工程名: HelloWorld
路径名:为你的代码路径
然后新建一个空工程.完成后,把前面的 HelloWorld.c 和HelloWorld.h文件加入你的工程
另外由于你的HelloWorld.c中包含了 <jni.h>.编译是会说找不到这个头文件,你需要做如下设置
project setting-->c/C++/ 在 分类:下拉列表中选择 预处理器
然后 在附加包含路径那里,加入:
你的jdk安装路径中的 include 路径,和include/win32 这两个路径,那里面有 <jni.h>这个头文件
以及<jni_md.h>
我的加入路径如下:
C:\Java\jdk1.7.0\include,C:\Java\jdk1.7.0\include\win32
编译成功后,会生成Helloworld.dll. 在你的工程目录的 debug文件夹中。
然后把HelloWorld.dll 拷贝到你的 HelloWorld.class所在的目录。记住他们要在同一个目录下然后执行:
java HelloWorld 这样就可以运行了.
或者
java -Djava.library.path=. HelloWorld //这条命令先是指定 java本地库的搜索路么为当前路么,然后运行 HelloWorld 这个类.
代码分别如下:
----- HelloWorld.java 文件----内容如下 :
class HelloWorld{
private native void print();
public static void main(String[] args){
new HelloWorld().print();
}
static {
System.loadLibrary("HelloWorld");
}
}
------HelloWorld.h-----内容如下
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloWorld */
#ifndef _Included_HelloWorld
#define _Included_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: HelloWorld
* Method: print
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloWorld_print
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
-----HelloWorld.c----如下:
#include <jni.h>
#include <stdio.h>
#include "HelloWorld.h"
JNIEXPORT void JNICALL Java_HelloWorld_print(JNIEnv *env, jobject obj)
{
printf("Hello World!\n");
return;
}
java jni 编程的更多相关文章
- Java JNI 编程进阶 实例+c++数据类型与jni数据类型转换
原文:http://www.iteye.com/topic/295776 JNI一直以来都很少去关注,但却是我心中的一个结,最近这几天刚好手头有点时间,因此抽空看了一下这方面的东西,整理了一份文档,J ...
- 三、Android NDK编程预备之Java jni入门创建C/C++共享库
转自: http://www.eoeandroid.com/thread-264971-1-1.html 应网友回复,答应在两天前要出一篇创建C/C++共享库的,但由于清明节假期,跟朋友出去游玩,丢手 ...
- 二、Android NDK编程预备之Java jni入门Hello World
转自: http://www.eoeandroid.com/forum.php?mod=viewthread&tid=264543&fromuid=588695 昨天已经简要介绍了J ...
- 一、Android NDK编程预备之Java jni简介
转自: http://www.eoeandroid.com/thread-264384-1-1.html 游戏开发 视频教程 博客 淘帖 论坛›eoe·Android应用开发区›Androi ...
- JNI编程(二) —— 让C++和Java相互调用(2)
3.getRamdomOrder() 这个方法会从backend得到一个随机的Order对象(抱歉这里“Random”拼错了),然后再调用java中相应的通知方法来通知foreground.getRa ...
- JNI编程(二) —— 让C++和Java相互调用(1)
自己在外面偷偷的算了下,又有将近两个月没更新过blog了.趁着今天有兴致,来更新JNI编程的第二篇文章.在第一篇里,大概介绍了JNI的特点.用途和优劣.并且做一个最简单的JNI的例子,不过说实话那个例 ...
- 解析Java的JNI编程中的对象引用与内存泄漏问题
JNI,Java Native Interface,是 native code 的编程接口.JNI 使 Java 代码程序可以与 native code 交互——在 Java 程序中调用 native ...
- 在 JNI 编程中避免内存泄漏
JAVA 中的内存泄漏 JAVA 编程中的内存泄漏,从泄漏的内存位置角度可以分为两种:JVM 中 Java Heap 的内存泄漏:JVM 内存中 native memory 的内存泄漏. Java H ...
- NDK(22)JNI编程如何避免常见缺陷
转自 : http://www.ibm.com/developerworks/cn/java/j-jni/index.html 避免常见缺陷 假设您编写了一些新 JNI 代码,或者继承了别处的某些 J ...
随机推荐
- LightOJ 1317
Time Limit:2000MS Memory Limit:32768KB 64bit IO Format:%lld & %lluDescription You probab ...
- NOIP2014解题报告
day 1 1.生活大爆炸版石头剪刀布(rps) 直接按照题意模拟即可 #include<cstdio> #include<algorithm> #include<cst ...
- TCP粘包和半包的处理方法
先把处理的方法的代码放这里: 解析数据帧的代码: bool CSocket::findData(byte* buff, int& len) { for (int i = 0; i <= ...
- PHP 字符串处理 总结
PHP 字符串处理 PHP 字符串处理 PHP 的字符串处理功能非常强大,主要包括: 字符串输出 echo():输出一个或多个字符串 print():输出一个字符串 printf():输出格式化字符串 ...
- nginx配置ssl加密(单双向认证、部分https)
nginx配置ssl加密(单双向认证.部分https) nginx下配置ssl本来是很简单的,无论是去认证中心买SSL安全证书还是自签署证书,但最近公司OA的一个需求,得以有个机会实际折腾一番.一开始 ...
- perl学习(3) 列表
列表或称为数组,和c语言中的数据类似,只是perl自己特殊的一些写法. 1.1.定义 一个列表或者数组可以包含数字,字符串,undef 值,或者任意不同类型的标量值的组合,但是这些元素的类型通常是 ...
- LNK 2005 error 函数定义也是定义!!
url=Ccne-rWwUO9tJp5YAPcycUw09__2whgZLpLw2aWVuYuE-fhu46kaVNX4BldWlsxig1tDML47aO_ctD3PcUlGjK"> ...
- VS2005+WINDDK+Driver Studio 3.2个人总结
通过在网上搜索大量的资料,终于把环境搭建起来.对于我这样的驱动新手来说,理应把高手们的东西整理并总结下,方便以后的初学者. 这三个软件的安装顺序没有具体规定,也有高手推荐的顺序,我自己也是重复安装卸载 ...
- MySQL 讨厌哪种类型的查询
㈠ 任何查询都讨厌 只要是查询.MySQL都讨厌.执行查询最快的方式就是不去执行 缓存为王.比如Redis或者memcache ㈡ 查 ...
- ceph存储之查找对象
对象存储(而非块存储): 要把对象存入ceph集群,客户端必须做到: 1.指定对象名 2.指定存储池 Ceph客户端检出最新集群运行图,客户端用CRUSH算法动态地计算出如何把对象映射到归置组.然后计 ...