博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java jni 编程
阅读量:6115 次
发布时间:2019-06-21

本文共 2459 字,大约阅读时间需要 8 分钟。

最近要学习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;
}  

 

转载地址:http://dqcka.baihongyu.com/

你可能感兴趣的文章
(十六)字段表集合
查看>>
JPGraph
查看>>
实验二 Java面向对象程序设计
查看>>
------__________________________9余数定理-__________ 1163______________
查看>>
webapp返回上一页 处理
查看>>
新安装的WAMP中phpmyadmin的密码问题
查看>>
20172303 2017-2018-2 《程序设计与数据结构》第5周学习总结
查看>>
eclipse中将一个项目作为library导入另一个项目中
查看>>
Go语言学习(五)----- 数组
查看>>
Android源码学习之观察者模式应用
查看>>
Content Provider的权限
查看>>
416. Partition Equal Subset Sum
查看>>
centos7.0 64位系统安装 nginx
查看>>
数据库运维平台~自动化上线审核需求
查看>>
注解开发
查看>>
如何用 Robotframework 来编写优秀的测试用例
查看>>
Django之FBV与CBV
查看>>
Vue之项目搭建
查看>>
app内部H5测试点总结
查看>>
Docker - 创建支持SSH服务的容器镜像
查看>>