`

运用jni接口,调用本地c方法

    博客分类:
  • jni
阅读更多
[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]
  • jni.tar.gz (3.7 KB)
  • 描述: linux下的压缩格式
  • 下载次数: 17
分享到:
评论

相关推荐

    java开源包1

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

    JAVA上百实例源码以及开源项目

    演示Address EJB的实现,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口函数得到远程...

    JAVA上百实例源码以及开源项目源代码

    演示Address EJB的实现,创建一个EJB测试客户端,得到名字上下文,查询jndi名,通过强制转型得到Home接口,getInitialContext()函数返回一个经过初始化的上下文,用client的getHome()函数调用Home接口函数得到远程...

    java开源包11

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

    java开源包2

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

    java开源包3

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

    java开源包6

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

    java开源包5

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

    java开源包10

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

    java开源包4

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

    java开源包8

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

    java开源包7

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

    java开源包9

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

    java开源包101

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

    Java资源包01

    JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java对象集进行查询,排序,分组。 搜索自动提示 Autotips AutoTips是为解决应用系统对于...

Global site tag (gtag.js) - Google Analytics