Linux下jni 调用 小例子

来源:互联网 发布:淘宝宝贝无法上架 编辑:程序博客网 时间:2024/06/03 04:53

先创建一个Java Project ,然后创建一个类HelloWorld

public class HelloWorld {
    public native void sayHello();
    
    static {
        System.loadLibrary("HelloWorld");
    }
    public static void main(String[] args){
        (new HelloWorld()).sayHello();
    }
}

javac HelloWorld.java 生成.class文件

javah -jni HelloWorld 生成HelloWorld.h内容如下

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

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

#ifdef __cplusplus
}
#endif
#endif


在同一目录下建HelloWorld.c文件,内容如下:

#include <jni.h>
#include "HelloWorld.h"
#include <stdio.h>

JNIEXPORT void JNICALL Java_HelloWorld_sayHello
  (JNIEnv *env, jobject obj){
    printf("HelloWorld!!!");
}

注意修改一下函数的参数列表


下面生成.so文件

gcc -fPIC -shared -I /usr/lib/jvm/jdk8/include -I /usr/lib/jvm/jdk8/include/linux -o libHelloWorld.so HelloWorld.c

其中-I后面跟的是jni.h和jni_md.h文件的路径 不加的话会报错,表示没有找到jni.h和jni_md.h

生成.so之后 执行java HelloWorld

可能会报错,so文件不在library路径下

这时候设置一下LD_LIBRARY_PATH 命令 export LD_LIBRARY_PATH=/home/hana/lib  (这个路径可以根据自己需要设置,或者自己创建这样一个文件夹,专门放置so文件)

把so文件拷贝进去

再执行java HelloWorld

就OK了

0 0