码迷,mamicode.com
首页 > 其他好文 > 详细

jni基础

时间:2015-03-05 14:39:22      阅读:133      评论:0      收藏:0      [点我收藏+]

标签:

学习hadoop的过程中涉及到了jni,了解了下jni的原理:

jni,java native interface,它弥补了JAVA的与平台无关这一优点的不足,在JAVA实现跨平台的同时,也能与其它语言(如C、C++)的动态库进行交互,给其它语言发挥优势的机会。应用于性能要求高,有系统调用的时候。

具体步骤:

技术分享

创建TestJni.java

public class TestJni
{
    public native void print(String str);
    static
    {
        System.loadLibrary("MyJni");
    }
    public static void main(String[] args)
    {
        new TestJni().print("hello jni");
    }
}

print()方法是一个native方法,是要用C语言去实现的,在static块中,指定加载需要的*.so。

编译TestJni.java得到class文件,从class文件得到头文件:javah –jni TestJni,得到TestJni.h,复制TestJni.h->MyJni.c:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>             
#include <stdio.h>
/* Header for class TestJni */

#ifndef _Included_TestJni
#define _Included_TestJni
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     TestJni
 * Method:    print
 * Signature: (Ljava/lang/String;)V
 */
JNIEXPORT void JNICALL Java_TestJni_print
  (JNIEnv *env, jobject obj, jstring str)
{
     jchar *s = (jchar *)(*env)->GetStringUTFChars(env, str, NULL);
    printf("content is %s\n", (char *)s);
     (*env)->ReleaseStringUTFChars(env, str,(const char*)s);
}

#ifdef __cplusplus
}
#endif
#endif

得到libMyJni.so:   gcc -fPIC -shared -o libMyJni.so MyJni.c -I. -I/usr/java/jdk1.7.0_75/include -I/usr/java/jdk1.7.0_75/include/linux,加载相应的include的文件,执行java –Djava.library.path=. TestJni:

content is hello jni

jni基础

标签:

原文地址:http://www.cnblogs.com/dslover/p/4315523.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!