JNI入门之HelloWorld(一)

来源:互联网 发布:mac队全灭事件真相 编辑:程序博客网 时间:2024/05/21 23:34

注意:此实例程序使用vim完成,而非使用Eclipse IDE,因此Java代码和C代码的源码文件的放置位置以及目录结构可能与通常的IDE的默认设置不符,本实例的代码目录结构:


1、 创建工程目录HelloWorld,在HelloWorld中创建源码目录src,然后在源码目录中创建源码package,package命名为com.helloworld,然后在package中创建源码文件HelloWorld.java,源码文件内容如下:

package com.helloworld;

public class HelloWorld

{

        static

        {

                System.loadLibrary("helloworld");

        }

        public static void main(String[] args)

        {

                (new HelloWorld()).print();

        }

        private native void print();

}

2、 生成HelloWorld.class文件:javac HelloWorld.java

3、 生成com_helloworld_HelloWorld.h文件:javah -jni com.helloworld.HelloWorld, 执行这个步骤时需要注意,要首先cd到src目录下,而不能直接在package下面,除非package为空,否则会报错找不到HelloWorld.class文件,然后也不能直接使用javah调用HelloWorld,还需要在其前面加上package名变成:com.helloworld.HelloWorld(如果package名为空,则变成HelloWorld,就是直接调用HelloWorld);

4、 移动com_helloworld_HelloWorld.h到HelloWorld.java文件所在目录下:mv com_helloworld_HelloWorld.h com/helloworld/

5、 创建com_helloworld_HelloWorld.c文件,将com_helloworld_HelloWorld.h中生成的函数JNIEXPORT void JNICALL Java_com_helloworld_HelloWorld_print(JNIEnv *, jobject);复制到com_helloworld_HelloWorld.c中实现(在本例中只有一个native函数,如果有多个native函数,则都需要复制过来进行实现),com_helloworld_HelloWorld.c的源码如下:

#include <jni.h>

#include <stdio.h>

#include "com_helloworld_HelloWorld.h"

JNIEXPORT void JNICALL Java_com_helloworld_HelloWorld_print(JNIEnv *env, jobject obj)

{

        printf("Hello World!\n");

}

6、 编译com_helloworld_HelloWorld.c生成步骤1中        

static

{

System.loadLibrary("helloworld");

}

中指定的.so文件:libhelloworld.so:

gcc -I /usr/lib/jvm/java-6-sun/include -I /usr/lib/jvm/java-6-sun/include/linux -fPIC -shared -o libhelloworld.so com_helloworld_HelloWorld.c

7、 执行HelloWorld.class程序:java -Djava.library.path=com/helloworld com.helloworld.HelloWorld,这个步骤也需要注意,要先cd到src目录下,在HelloWorld.java所在目录下执行也会出错,其中-D选项用法:

-D<name>=<value>   set a system property

用于设置一个系统属性,此处用于设置libhelloworld.so的路径,如果设置不正确,执行时会报如下的错误:

Exception in thread "main" java.lang.UnsatisfiedLinkError: no helloworld 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 com.helloworld.HelloWorld.<clinit>(HelloWorld.java:7)

Could not find the main class: com.helloworld.HelloWorld.  Program will exit.

8、 总结:如果Java代码文件的package不为空,在生成.h文件、执行.class时就会有很多地方受到影响,因此需要小心谨慎。

9、 文档下载地址:http://download.csdn.net/download/xiruanliuwei/3923930


原创粉丝点击