java_jni详解_01

java中的jni 例子HelloWorld

准备过程:
1. 创建一个类(HelloWorld.java)
2. 使用javac编译该类    HelloWorld.class
3. 利用javah -jni产生头文件   HelloWorld.h
4. 用本地代码实现头文件中定义的方法  HelloWorld.c
5. 编译c文件 HelloWorld.so 或者 HelloWorld.dll
6. 运行

HelloWorld.java
public class HelloWorld {
   public native void print();  //声明本地方法
   
   public static void main(String[] args) {
	   new HelloWorld().print();
   }
   
   static{
	   System.loadLibrary("HelloWorld"); // 加载库文件
   }
}


javac 编译HelloWorld文件
javac HelloWorld.java


创建头文件 进入到工程的bin目录下
javah -jni HelloWorld
javah jni.sample.HelloWorld
"-jni"为默认参数,可有可无.
关键代码如下:
/*
 * Class:     jni_sample_HelloWorld
 * Method:    print
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_jni_sample_HelloWorld_print
  (JNIEnv *, jobject);

JNIEnv 是 JNI 核心数据之一,地位非常崇高,所有对 JNI 的调用都要通过此结构。


实现头文件:
HelloWorld.c文件
#include <jni.h>
#include <stdio.h>  
#include "HelloWorld.h"
// printf 在stdio.h头文件中
JNIEXPORT void JNICALL Java_jni_sample_HelloWorld_print(JNIEnv* env,jobject thiz)
{
	printf("Hello World!\n");
	return;
}

在工程的bin目录下
gcc -dynamiclib -o libhelloworld.so HelloWorld.c -framework JavaVM -I/System/Library/Frameworks/JavaVM.framework/Headers
编译C++代码的时候在MacOS下和在Linux, Windows有所不同, 不是编译成.so或者dll, 而是MacOS自己的jnilib. 并且jni.h的目录也比较特殊, 是/System/Library/Frameworks/JavaVM.framework/Headers/, 这个需要稍微注意一下

windows下
cl -Ic:\java\include -Ic:\java\include\win32 -MD -LD HelloWorld.c
-FeHelloWorld.dll


1) 在/Users下建立一个用来存放.so库文件的目录,比如/Users/zhaoshun/solibs
2) 把libhelloworld.so文件拷贝到该目录下
3)打开Terminal,运行如下命令
export LD_LIBRARY_PATH=/Users/zhaoshun/solibs
只在当前shell下有效...

也可以用绝对路径
System.load("/Users/zhaoshun/solibs/libhelloworld.so");













猜你喜欢

转载自abc20899.iteye.com/blog/1864415
今日推荐