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
- JNI入门之HelloWorld(一)
- andorid jni入门教程一之helloworld
- andorid jni入门教程一之helloworld
- andorid jni入门教程一之helloworld
- andorid jni入门教程一之helloworld
- andorid jni入门教程一之helloworld
- andorid jni入门教程一之helloworld
- JNI学习(一)----helloworld
- JNI之helloworld
- jni入门教程之HelloWorld
- JNI之HelloWorld
- JNI之helloworld
- JNI之helloworld
- Android Jni之Helloworld
- JNI之HelloWorld
- JNI之HelloWorld
- Zynq入门基础实验一之Helloworld
- FreeMarker入门笔记一之helloworld
- RandomHelper-随机数辅助类
- 数据库方言
- VC2010如何给ActiveX添加事件
- 目标5——启动Gii——Yii代码脚手架
- sofamvc
- JNI入门之HelloWorld(一)
- cvMeanShift函数调用实现
- GridView 导出数据到excel数据乱码
- 在 Tomcat 中部署 Java Web 程序 ( jar cvf *.war */. ) war 包
- KeyWordHelper-关键字提取类(注:使用第三方组件DictSeg.dll)
- Java 线程池的原理与实现
- android Theme level 11 使用总结
- SHFileOperation函数
- 简述四种关联映射