第一步:
编写init.java文件
package com.dbc.yangg;
public class init{
public native void print(String str);
static{
System.loadLibrary("MyJni");
}
public static void main(String[] argv){
System.out.println("hello");
new init().print("jni callback!");
}
}
注意:init.java 文件放在文件系统中的目录结构应该是~/jni/com/dbc/yangg/init.java
第二步:
进入~/jni/com/dbc/yangg/目录使用命令编译init.java文件生成init.class文件
javac init.java
第三步:
进入~/jni/使用命令生成c/c++ core head文件
javah -jni com.dbc.yangg.init
将在 ~/jni/目录下生成com_dbc_yangg_init.h的c/c++ core head 文件内容如下
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_dbc_yangg_init */
#ifndef _Included_com_dbc_yangg_init
#define _Included_com_dbc_yangg_init
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_dbc_yangg_init
* Method: print
* Signature: (Ljava/lang/String;)V
*/
JNIEXPORT void JNICALL Java_com_dbc_yangg_init_print
(JNIEnv *, jobject, jstring);//需要实现的方法
#ifdef __cplusplus
}
#endif
#endif
第四步:
由于我们在java里面调用的动态类库名为MyJni,使用命令mv com_dbc_yangg_init.h MyJni.h将生成的com_dbc_yangg_init.h重命名为MyJni.h,并编写MyJni.c实现MyJni.h中
JNIEXPORT void JNICALL Java_com_dbc_yangg_init_print(JNIEnv *, jobject, jstring)方法
MyJni.c代码示例如下:
#include "MyJni.h"
#include <stdio.h>
JNIEXPORT void JNICALL Java_com_dbc_yangg_init_print
(JNIEnv *env, jobject obj, jstring jstr){
char *cstr=(char *)(*env)->GetStringUTFChars(env,jstr,NULL);
printf("%s\n",cstr);
}
第五步:
在目录~/jni/下使用命令生成动态链接库
gcc -fPIC -shared -o libMyJni.so MyJni.c -I/usr/java/jdk-1.6.0_u45/include -I/usr/java/jdk-1.6.0_u45/include/linux -I.
注意:动态链接库so文件前缀必须是以lib开头
说明:
/usr/java/jdk-1.6.0_u45 为jdk的安装路径 主要是加载jni.h文件 $JDK_HOME/include/linux 系统类型
执行完后将在~/jni/目录下生成libMyJni.so 及是我们需要的动态链接库
第六步:
运行测试:进入目录~/jni/输入命令java -Djava.library.path=/home/hadoopadmin/jni/com/dbc/yangg/ com.dbc.yangg.init
运行结果如下:
hello
jni callback!
说明配置成功