您的位置:首页 > 编程语言 > Java开发

java jni编程详细步骤及注意细节

2013-12-17 17:20 134 查看
第一步:

编写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!
说明配置成功
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: