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头文件,文件内容如下 

/* 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

4、编写本地实现代码

使用Linux下的C/C++语言实现java中定义的方法,main.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 ;
}

使用命令行编译

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!