JNI(一)使用实例HelloWorld

1、编写Java程序TestHello类,声明native方法hello

package com.charles;

public class TestHello {

    static {
        System.loadLibrary("TestHello");
    }

    public static native void hello(String msg);

    public static void main(String[] args) {
        hello("charles!");
    }

}

本地hello方法为libTestHello提供,由C/C++实现。

2、编译java代码

javac com/charles/TestHello.java

生成TestHello.class文件

3、使用javah生成头文件

javah com.charles.TestHello

在当前目录下生成com_charles_TestHello.h头文件,文件内容如下

<pre class="prettyprint lang-cpp">/* DO NOT EDIT THIS FILE - it is machine generated / =include <jni.h> / Header for class com_charles_TestHello */

=ifndef _Included_com_charles_TestHello =define _Included_com_charles_TestHello =ifdef __cplusplus extern "C" { =endif /* * Class: com_charles_TestHello * Method: hello * Signature: (Ljava/lang/String;)V */ JNIEXPORT void JNICALL Java_com_charles_TestHello_hello (JNIEnv *, jclass, jstring);

=ifdef __cplusplus } =endif =endif</pre>

4、编写本地实现代码

使用Linux下的C/C++语言实现java中定义的方法,main.cpp内容如下

<pre class="prettyprint lang-cpp">=include <jni.h> =include <iostream> =include "com_charles_TestHello.h"

using namespace std;

JNIEXPORT void JNICALL Java_com_charles_TestHello_hello(JNIEnv * env , jclass obj_class, jstring jstr) { // 获取字符串的长度 jsize len = env→GetStringLength(jstr);

// 获取字符串
const char * name = env->GetStringUTFChars(jstr, NULL);
cout <<"size:"<<len<<endl;
cout <<"name:"<<name<<endl;
env->ReleaseStringUTFChars(jstr, name);
    return ;
}</pre>

使用命令行编译

1)编译生成中间对象

g++ -Wall -fexceptions -fPIC -I/home/charles/JavaDev/jdk1.8.0_25/include -I/home/charles/JavaDev/jdk1.8.0_25/include/linux -c /home/charles/TestHello/main.cpp -o obj/Debug/main.o

2)编译生成共享库

g++ -shared  obj/Debug/main.o  -o bin/Debug/libTestHello.so

3)执行代码

将libTestHello.so拷贝到com.charles.TestHello的执行路径下,设置-Djava.library.path加载的本地库libTestHello的路径

java -Djava.library.path=. com.charles.TestHello

控制台上就可以看到本地方法中实现的hello方法的输出。

size:8
name:charles!
文章目录