Chinaunix首页 | 论坛 | 博客
  • 博客访问: 211365
  • 博文数量: 16
  • 博客积分: 371
  • 博客等级: 二等列兵
  • 技术积分: 170
  • 用 户 组: 普通用户
  • 注册时间: 2011-08-09 21:56
文章分类

全部博文(16)

文章存档

2015年(4)

2012年(3)

2011年(9)

分类: Java

2011-11-12 21:55:58

Android开发中有NDK编程,即让Android可以运行C/C 代码,这其中涉及到JAVA的JNI编程,下面就把我这几天琢磨的JNI编程的学习笔记写下来:
1.要让Java可以运行C代码,首先需要一个调用C代码的java源程序。
源程序如下:
HelloWorld.java
  1. class HelloWorld
  2. {
  3. public native void displayHelloWorld();
  4. static{
  5. System.loadLibrary("HelloWorld");
  6. }
  7. public static void main (String[] args) {
  8. new HelloWorld().displayHelloWorld();
  9. }
  10. }
红色部分是displayHelloWorld()方法的声明,它有一个要害字native,表明这个方法使用java以外的语言实现。方法不包括实现,因为我们要用c/c++语言实现它。注重System.loadLibrary("helloWorld")这句代码,它是在静态初始化块中定义的,系统用来装载HelloWorld共享库,这就是我们在后面生成的HelloWorld.dll(假如在其他的操作系统可能是其他的形式,比如 HelloWorld .so)

2.编译生成.h文件
javac HelloWorld.java
javah -jni HelloWorld 就会生成HelloWorld.class 和 HelloWorld.h

HelloWorld.h
  1. /* DO NOT EDIT THIS FILE - it is machine generated */
  2. #include
  3. /* Header for class HelloWorld */
  4. #ifndef _Included_HelloWorld
  5. #define _Included_HelloWorld
  6. #ifdef __cplusplus
  7. extern "C" {
  8. #endif
  9. /*
  10. * Class: HelloWorld
  11. * Method: displayHelloWorld
  12. * Signature: ()V
  13. */
  14. JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld
  15. (JNIEnv *, jobject);
  16. #ifdef __cplusplus
  17. }
  18. #endif
  19. #endif
3.C源程序和生成Dll文件
  1. #include <C:\Program Files (x86)\Java\jdk1.7.0_01\include\jni.h>
  2. #include "..\HelloWorld.h"
  3. #include <stdio.h>
  4. JNIEXPORT void JNICALL
  5. Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj)
  6. {
  7.     printf("Hello world!\n");
  8.     return ;
  9. }
然后将Dll文件和java编译后的文件放在一起(都放在工作目录里面)

最后运行java 程序就OK了

最后记下我在学习过程中碰到的问题:
1.Dll文件的生成  缺少头文件jni.h等
写本地C语言文件是要准确写下jni.h的路径,一般是在java安装目录下面例如jni.h在C:\Program Files\Java\jdk1.7.0\include,如果编译过程中还缺少头文件,一般也在安装目录下面能找到。
2.关于can't load IA 32-bit .dll on a AMD 64-bit platform
你的JAVA虚拟机是64位的,它不能加载32位的DLL文件(这是因为VC++也是32位的),解决办法重新安装32位的Java虚拟机jre-6u23-windows-i586.exe。



阅读(3118) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~