JNI入门

2016-08-23  本文已影响0人  zjjfly

第一步

新建一个java文件HelloJni.java,内容如下:

public class HelloJni{

static{
    System.loadLibrary("hellojni"); 
}
public static void main(String[] args){
    HelloJni helloJni = new HelloJni();
    helloJni.sayHello();
}

native void sayHello();
}

第二步

用命令javah HelloJni生成一个头文件,内容一般如下:

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

#ifndef _Included_HelloJni
#define _Included_HelloJni
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class:     HelloJni
* Method:    sayHello
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloJni_sayHello
    (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

第三步

实现这个jni调用的本地方法,新建HelloJni.c,内容如下:

#include <stdio.h>
#include "HelloJni.h"

/*该方法在HelloJni.h中声明
 JNIEXPORT和JNICALL都是JNI中的关键字
    JNIEnv对应java线程中调用的JNI环境,通过这个参数可以调用  一些JNI函数
jobject对应当前java线程中调用本地方法的对象
*/
JNIEXPORT void JNICALL Java_HelloJni_sayHello
(JNIEnv * env, jobject obj)
{
    printf("HelloJni! This is my first jni call.");
}

第四步

把c文件和头文件编译成c动态库,命令如下:

#mac os x 
gcc -shared HelloJni.c -I/SystemLibraryFrameworks/JavaVM.framework/Headers -o libhellojni.dylib 
#linux
gcc -fPIC -D_REENTRANT -I/$JAVA_HOME/include -I/$JAVA_HOME/include/linux -shared -o libhellojni.so  HelloJni.c

<font color=red>注意$JAVA_HOME要替换成jdk根目录。生成的动态库名务必以lib开头</font>

第五步

查询出java.library.path这个属性指向的路径,把编译出来的动态库复制到这些路径中的某一个,并用sudo chmod 777 libhellojni.so加上所以权限。

第六步

用javac命令编译第一步的java文件,然后用java HelloJni 运行,得到结果:

HelloJni! This is my first jni call.
上一篇 下一篇

猜你喜欢

热点阅读