Android开发中有NDK编程,即让Android可以运行C/C 代码,这其中涉及到JAVA的JNI编程,下面就把我这几天琢磨的JNI编程的学习笔记写下来:
1.要让Java可以运行C代码,首先需要一个调用C代码的java源程序。
源程序如下:
HelloWorld.java
- class HelloWorld
-
{
- public native void displayHelloWorld();
- static{
- System.loadLibrary("HelloWorld");
- }
-
- public static void main (String[] args) {
- new HelloWorld().displayHelloWorld();
- }
-
}
红色部分是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
- /* DO NOT EDIT THIS FILE - it is machine generated */
-
#include
-
/* Header for class HelloWorld */
-
-
#ifndef _Included_HelloWorld
-
#define _Included_HelloWorld
-
#ifdef __cplusplus
-
extern "C" {
-
#endif
-
/*
-
* Class: HelloWorld
-
* Method: displayHelloWorld
-
* Signature: ()V
-
*/
-
JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld
-
(JNIEnv *, jobject);
-
-
#ifdef __cplusplus
-
}
-
#endif
-
#endif
3.C源程序和生成Dll文件
- #include <C:\Program Files (x86)\Java\jdk1.7.0_01\include\jni.h>
-
#include "..\HelloWorld.h"
-
#include <stdio.h>
-
JNIEXPORT void JNICALL
-
Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj)
-
{
-
printf("Hello world!\n");
-
return ;
-
}
然后将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。
阅读(3124) | 评论(0) | 转发(0) |