注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

和申的个人主页

专注于java开发,1985wanggang

 
 
 

日志

 
 

eclispe+ mingw + jni 第一个程序 Hello world程序  

2013-05-21 10:28:07|  分类: JNI |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
初学jni,遇到了N多困难。
1.找不到jni.h和jni_md.h的问题
2.无法编译成dll,选成default的生成exe模式了。
3.生成的dll,无法在java中找到
eclispe+ mingw + jni fisrt program Hello world程序 - 和申 - 和申的个人主页
 


java.lang.UnsatisfiedLinkError: no libhelloc2 in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1738)
at java.lang.Runtime.loadLibrary0(Runtime.java:823)
at java.lang.System.loadLibrary(System.java:1028)
at test.Hello.<clinit>(Hello.java:15)
Exception in thread "main" 

4.终于找到lib库了,找不到方法。
eclispe+ mingw + jni fisrt program Hello world程序 - 和申 - 和申的个人主页
 


Exception in thread "main" java.lang.UnsatisfiedLinkError: test.Hello.sayHello()V
at test.Hello.sayHello(Native Method)
at test.Hello.main(Hello.java:24)

操作系统:Windows 7 x64
JDK版本:1.6.0_32 x86(因为其他程序需要x86故没有在x64的环境)
Eclipse版本:Eclipse IDE for C/C++ Developers
            Version: Juno Service Release 2
            Build id: 20130225-0426
Eclipse  支持java的eclipse:
参见:

eclispe+ mingw + jni 环境搭建http://1985wanggang.blog.163.com/blog/static/7763833201342052752302/









eclipse下新建JavaHello    Project
eclispe+ mingw + jni fisrt program Hello world程序 - 和申 - 和申的个人主页
Hello.java

/**
*
*/
package test;

/**
* @author wanggang
*
*/
public class Hello {

public native void sayHello();
static{

System.loadLibrary("libsharedlibtest2");
}
/**
* @param args
*/
public static void main(String[] args) {
System.out.println(System.getProperty("java.library.path"));

Hello h = new Hello();
h.sayHello();
}

}

src/ 新建 gen.bat

echo 当前盘符:%~d0
echo 当前盘符和路径:%~dp0

set base=%~dp0
cd %base%

%~d0
javac test/Hello.java

javah -jni test.Hello
@pause

执行结果如图:
eclispe+ mingw + jni fisrt program Hello world程序 - 和申 - 和申的个人主页
 
刷新下:

 
eclispe+ mingw + jni fisrt program Hello world程序 - 和申 - 和申的个人主页
 

得到test_Hello.h
这个文件:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class test_Hello */

#ifndef _Included_test_Hello
#define _Included_test_Hello
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: test_Hello
* Method: sayHello
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_test_Hello_sayHello
(JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif



注意:
/*
* Class: test_Hello
* Method: sayHello
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_test_Hello_sayHello

这个方法修改下:方法名前加上下划线 (      _    必须要加,我开始就是没有加找不到方法。
JNIEXPORT void JNICALL _Java_test_Hello_sayHello

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class test_Hello */

#ifndef _Included_test_Hello
#define _Included_test_Hello
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: test_Hello
* Method: sayHello
* Signature: ()V
*/
JNIEXPORT void JNICALL _Java_test_Hello_sayHello
(JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

这样就可以,将其copy到新建的c project中.
eclispe+ mingw + jni fisrt program Hello world程序 - 和申 - 和申的个人主页
 
eclispe+ mingw + jni fisrt program Hello world程序 - 和申 - 和申的个人主页
最开始,我选错了,导致无法编译成dll,选成default的生成exe模式了
 
eclispe+ mingw + jni fisrt program Hello world程序 - 和申 - 和申的个人主页
 eclispe+ mingw + jni fisrt program Hello world程序 - 和申 - 和申的个人主页
 
eclispe+ mingw + jni fisrt program Hello world程序 - 和申 - 和申的个人主页
 
include paths( -I) 加入路径 (jni.h)
D:\Program Files\Java\jdk1.6.0_32\include
include paths( -I) 再加一次路径(jni_md.h)
D:\Program Files\Java\jdk1.6.0_32\include\win32
eclispe+ mingw + jni fisrt program Hello world程序 - 和申 - 和申的个人主页
 
eclispe+ mingw + jni fisrt program Hello world程序 - 和申 - 和申的个人主页
如果没有添加就会出现  找不到jni.h和jni_md.h的问题

 将上面的修改后的test_Hello.h  文件copy 到c项目中。
eclispe+ mingw + jni fisrt program Hello world程序 - 和申 - 和申的个人主页
 


 新建 test_Hello_impl.c文件

/*
* test_Hello_impl.c
*
* Created on: 2013-5-20
* Author: wanggang
*/

#include <jni.h>
#include "test_Hello.h"
#include <stdio.h>
JNIEXPORT void JNICALL _Java_test_Hello_sayHello
(JNIEnv * env, jobject _obj){
printf("Hello world!\n");
return;
}


eclispe+ mingw + jni fisrt program Hello world程序 - 和申 - 和申的个人主页
 eclispe+ mingw + jni fisrt program Hello world程序 - 和申 - 和申的个人主页
 eclispe+ mingw + jni fisrt program Hello world程序 - 和申 - 和申的个人主页
 ok
eclispe+ mingw + jni fisrt program Hello world程序 - 和申 - 和申的个人主页
 eclispe+ mingw + jni fisrt program Hello world程序 - 和申 - 和申的个人主页
 控制台输出如下:

11:00:28 **** Rebuild of configuration Debug for project helloc ****
Info: Internal Builder is used for build
gcc "-ID:\\Program Files\\Java\\jdk1.6.0_32\\include" "-ID:\\Program Files\\Java\\jdk1.6.0_32\\include\\win32" -O0 -g3 -Wall -c -fmessage-length=0 -o test_Hello_impl.o "..\\test_Hello_impl.c"
gcc -shared -o libhelloc.dll test_Hello_impl.o

11:00:32 Build Finished (took 3s.988ms)

生成dll如下:
eclispe+ mingw + jni fisrt program Hello world程序 - 和申 - 和申的个人主页
 
libhelloc.dll

先写个Test程序:
System.out.println(System.getProperty("java.library.path"));
看看java.library.path的路径:
D:\Program Files\Java\jdk1.6.0_32\bin;.;C:\Windows\Sun\Java\bin;C:\Windows\system32;C:\Windows;C:\Perl64\site\bin;C:\Perl64\bin;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files\SlikSvn\bin;C:\Program Files (x86)\Tail4win;C:\MinGW\bin;D:\dev\mvn\bin;"C:\Program Files (x86)\Notepad++\";D:\Program Files\Java\jdk1.6.0_32\bin;D:\adb;C:\Program Files (x86)\EditPlus 3;C:\command

如这样的路径,将,libhelloc.dll 随便放入一个路径中就可以了。当然也可以自己配置路径。

/**
*
*/
package test;

/**
* @author wanggang
*
*/
public class Hello {

public native void sayHello();
static{

System.loadLibrary("libhelloc");
}
/**
* @param args
*/
public static void main(String[] args) {
System.out.println(System.getProperty("java.library.path"));

Hello h = new Hello();
h.sayHello();
}

}

java中如此调用就可以了。
结果
Hello world!


注:
.生成的dll,无法在java中找到
eclispe+ mingw + jni fisrt program Hello world程序 - 和申 - 和申的个人主页
 


java.lang.UnsatisfiedLinkError: no libhelloc2 in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1738)
at java.lang.Runtime.loadLibrary0(Runtime.java:823)
at java.lang.System.loadLibrary(System.java:1028)
at test.Hello.<clinit>(Hello.java:15)
Exception in thread "main" 

问题原因是没有将libhelloc.dll 放入 java.library.path的路径下。
4.终于找到lib库了,找不到方法。
eclispe+ mingw + jni fisrt program Hello world程序 - 和申 - 和申的个人主页
 
问题原因是没有将libhelloc.dll 已经放入 java.library.path的路径下,但没有找到方法。

  评论这张
 
阅读(1058)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016