最近要学习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 编程的更多相关文章

  1. Java JNI 编程进阶 实例+c++数据类型与jni数据类型转换

    原文:http://www.iteye.com/topic/295776 JNI一直以来都很少去关注,但却是我心中的一个结,最近这几天刚好手头有点时间,因此抽空看了一下这方面的东西,整理了一份文档,J ...

  2. 三、Android NDK编程预备之Java jni入门创建C/C++共享库

    转自: http://www.eoeandroid.com/thread-264971-1-1.html 应网友回复,答应在两天前要出一篇创建C/C++共享库的,但由于清明节假期,跟朋友出去游玩,丢手 ...

  3. 二、Android NDK编程预备之Java jni入门Hello World

    转自:  http://www.eoeandroid.com/forum.php?mod=viewthread&tid=264543&fromuid=588695 昨天已经简要介绍了J ...

  4. 一、Android NDK编程预备之Java jni简介

    转自:  http://www.eoeandroid.com/thread-264384-1-1.html 游戏开发 视频教程 博客 淘帖     论坛›eoe·Android应用开发区›Androi ...

  5. JNI编程(二) —— 让C++和Java相互调用(2)

    3.getRamdomOrder() 这个方法会从backend得到一个随机的Order对象(抱歉这里“Random”拼错了),然后再调用java中相应的通知方法来通知foreground.getRa ...

  6. JNI编程(二) —— 让C++和Java相互调用(1)

    自己在外面偷偷的算了下,又有将近两个月没更新过blog了.趁着今天有兴致,来更新JNI编程的第二篇文章.在第一篇里,大概介绍了JNI的特点.用途和优劣.并且做一个最简单的JNI的例子,不过说实话那个例 ...

  7. 解析Java的JNI编程中的对象引用与内存泄漏问题

    JNI,Java Native Interface,是 native code 的编程接口.JNI 使 Java 代码程序可以与 native code 交互——在 Java 程序中调用 native ...

  8. 在 JNI 编程中避免内存泄漏

    JAVA 中的内存泄漏 JAVA 编程中的内存泄漏,从泄漏的内存位置角度可以分为两种:JVM 中 Java Heap 的内存泄漏:JVM 内存中 native memory 的内存泄漏. Java H ...

  9. NDK(22)JNI编程如何避免常见缺陷

    转自 : http://www.ibm.com/developerworks/cn/java/j-jni/index.html 避免常见缺陷 假设您编写了一些新 JNI 代码,或者继承了别处的某些 J ...

随机推荐

  1. Web开发在线工具

    JSON: JSON格式化工具 JSON检验并格式化工具 专为Web开发者准备的 63个免费在线工具

  2. php随机10-thinkphp 3.1.3 模板继承 布局

    8.25 模板继承 模 板继承是3.1.2版本添加的一项更加灵活的模板布局方式,模板继承不同于模板布局,甚至来说,应该在模板布局的上层.模板继承其实并不难理解,就好比类 的继承一样,模板也可以定义一个 ...

  3. Android 进程和线程

    进程和线程 如果某个应用程序组件是第一次被启动,且这时应用程序也没有其他组件在运行,则Android系统会为应用程序创建一个包含单个线程的linux进程.默认情况下,同一个应用程序的所有组件都运行在同 ...

  4. android蓝牙(二)——接收数据

    在蓝牙开发中,我们有这种一个需求:我们的androidclient要始终保持和蓝牙的连接,当蓝牙有数据返回的时候,androidclient就要及时的收取数据,当蓝牙没有数据返回的时候我们就要保持an ...

  5. android一个弹出菜单的动画(二)

    假设做一个弹出的控件,我们能够进行加入view: 写class SatelliteMenu extends FrameLayout private void init(Context context, ...

  6. c# .net 读取json 字符串 与序列化和反序列化json字符串

    命名空间 using Newtonsoft.Json.Linq; JObject obj = JObject.Parse("json字符串");用 obj["" ...

  7. 在VS上配置OpenCV

    这几篇帖子讲的挺仔细的,而且不坑,结合看看就没问题了~~ http://www.cnblogs.com/cuteshongshong/p/4057193.html http://my.phirobot ...

  8. Eclipse使用技巧总结(一)

    一.建立工作空间 如上图所示,可以建立新的工作空间,或者切换工作空间. 二.导入导出工作空间配置 三.设置行号 如图,用鼠标在坐变阴影部分右击弹出菜单,选中Show Line Numbers一项. 四 ...

  9. 浏览器与服务器间的交互(客服端 <---> 服务器)

    浏览器与服务器间的交互(客服端 <---> 服务器) 请求--->处理--->响应 对类HttpContext 内部成员的使用 例如 :Request .Response .  ...

  10. java基础之junit测试框架

    1.导入junit包, 2.测试方法格式 public void test_*(){} 继承  TestCase  包(keep the bar green to keep the code clea ...