[size=-large]
方法步骤:
1.在java类中声明一个本地方法。
2.运行javah以获取包含该方法的c声明的头文件
3.用c实现该方法
4.将代码置于共享类库中。
5.在java程序中加载该库
详细实例:
系统:ubuntu 11.04/64bit
1.注意native关键字
HelloNative.java
class HelloNative {
public static native void greeting();
}
2.编译这个java源文件
javac HelloNative.java
生成
HelloNative.class
3.用javah 生成c函数的头文件,你也可以自己按照sun定义的标准写,还是自动生成简单些。
javah HelloNative
生成 HelloNative.h
内容如下
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloNative */
#ifndef _Included_HelloNative
#define _Included_HelloNative
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: HelloNative
* Method: greeting
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloNative_greeting
(JNIEnv *, jclass);
#ifdef __cplusplus
}
#endif
#endif
这个要真的去手写,出错的几率很大。
4.接下来就是函数的实现了,这个要自己动手编写
HelloNative.c
#include "HelloNative.h"
#include <stdio.h>
JNIEXPORT void JNICALL Java_HelloNative_greeting
(JNIEnv * env, jclass cl) {
printf("Hello Native World!\n");
}
事例只是向控制台打印一句 Hello Native World!
5.用gcc编译该源文件,在控制台中cd 到源文件的文件夹下
cd ~/code/android_demo/jni
gcc -fPIC -I JAVA_HOME/include -I JAVA_HOME/include/linux -shared -o libHelloNative.so HelloNative.c
运行时将JAVA_HOME替换为本地jdk的根目录,我的是/usr/lib/jvm/java/jdk1.6.0_23
正常运行后会生成以.so结尾的动态链接库文件,名为libHelloNative.so
6.编写java程序加载动态库文件
HelloWorldTest.java
class HelloWorldTest {
public static void main(String[] args) {
HelloNative.greeting();
}
static {
System.loadLibrary("HelloNative");
}
}
7.编译运行HelloWorldTest.java
命令:
javac HelloWorldTest.java
生成 HelloWorldTest.class
这时如果你直接运行会报
错误如下
Exception in thread "main" java.lang.UnsatisfiedLinkError: no HelloNative in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1734)
at java.lang.Runtime.loadLibrary0(Runtime.java:823)
at java.lang.System.loadLibrary(System.java:1028)
at HelloWorldTest.<clinit>(HelloWorldTest.java:7)
Could not find the main class: HelloWorldTest. Program will exit.
主要是这个错误引起:java.lang.UnsatisfiedLinkError: no HelloNative in java.library.path,意思是找不到load的动态链接库,这是一定,系统默认就是那几个指定的lib文件夹下,自己写的就要加进去才能被jvm找到,可以在运行的时候指定当前目录作为动态库位置进行加载
java -Djava.library.path=. HelloWorldTest
这样就正常了。
输出: Hello Native World!
恩,java已经很完没了,不是在然和时候jni都适合。
下面是我练习时的源码,有兴趣一起研究。
[/size][/size]
分享到:
相关推荐
JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...
演示Address EJB的实现,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口函数得到远程...
演示Address EJB的实现,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口函数得到远程...
JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...
JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...
JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...
JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...
JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...
JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...
JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...
JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...
JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...
JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...
JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...
JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...