JNI (Java Native Interface)是什么(3)

三、JNI(Java Native Interface)的简要使用例子

下面是一个简单的例子实现打印一句话的功能,但是用的c的printf最终实现。一般提供给java的jni接口包括一个so文件(封装了c函数的实现)和一个java文件(需要调用path的类)。

1. JNI的目的是使java方法中能够调用c实现的一些函数,比如以下的java类,就需要调用一个本地函数testjni(一般声明为private native类型),首先需要创建文件weiqiong.java,内容如下:

class weiqiong

JNI (Java Native Interface)是什么

JNI (Java Native Interface)是什么

...{
      
static

JNI (Java Native Interface)是什么

      
...{
           System.loadLibrary(
"testjni");//载入静态库,test函数在其中实现

JNI (Java Native Interface)是什么

      }

      
private native void testjni(); //声明本地调用
      public void test()

JNI (Java Native Interface)是什么

      
...{
           testjni();

JNI (Java Native Interface)是什么

      }

      
public static void main(String args[])

JNI (Java Native Interface)是什么

      
...{
           weiqiong haha 
= new weiqiong();
           haha.test();

JNI (Java Native Interface)是什么

      }

}

2.然后执行javac weiqiong.java,如果没有报错,会生成一个weiqiong.class。

3.然后执行javah weiqiong,会生成一个文件weiqiong.h文件,其中有一个函数的声明如下:

JNIEXPORT void JNICALL Java_weiqiong_testjni(JNIEnv *, jobject);

4.创建文件testjni.c将上面那个函数实现,内容如下:

#include "jni.h"
#include weiqiong.h

JNIEXPORT void JNICALL Java_weiqiong_testjni(JNIEnv *env, jobject obj)

JNI (Java Native Interface)是什么

JNI (Java Native Interface)是什么

...{
     printf(
"haha---------go into c!!! ");
}

5.为了生成.so文件,创建makefile文件如下:
libtestjni.so:testjni.o makefile
gcc -Wall -rdynamic -shared -o libtestjni.so testjni.o
testjni.o:testjni.c weiqiong.h
gcc -Wall -c testjni.c -I./ -I/usr/java/j2sdk1.4.0/include -I/usr/java/j2sdk1.4.0/include/linux
cl:
rm -rf *.o *.so
注意:gcc前面是tab空,j2sdk的目录根据自己装的j2sdk的具体版本来写,生成的so文件的名字必须是loadLibrary的参数名前加“lib”。

6.export LD_LIBRARY_PATH=.,由此设置library路径为当前目录,这样java文件才能找到so文件。一般的做法是将so文件copy到本机的LD_LIBRARY_PATH目录下。

7.执行java weiqiong,打印出结果:“haha---------go into c!!!”

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwdsss.html