linux下JNI开发—Hello为例

时间:2023-03-09 03:24:04
linux下JNI开发—Hello为例

转自:https://www.cnblogs.com/snake-hand/archive/2012/05/25/2517412.html

前期准备:

1、Java JDK

2、gcc

3、g++

确保上述准备工作完成后开始下边的工作:

Java代码:

public   class  Hello {
static {
try {
System.loadLibrary("Hello" );
} catch (UnsatisfiedLinkError e) {
e.printStackTrace();
}
} public Hello() {}; public native void SayHello(String strName);
}

在终端输入 javac Hello.java 后生成Hello.class 文件

然后:javah Hello 生成 Hello.h文件

 

然后在相同的目录下新建一个Hello.cpp文件:内容如下:

#include "Hello.h"
#include <stdio.h>
// 与 Hello.h 中函数声明相同
JNIEXPORT void JNICALL Java_Hello_SayHello (JNIEnv * env, jobject arg, jstring instring)
{
// 从 instring 字符串取得指向字符串 UTF 编码的指针
const jbyte *str =
(const jbyte *)env->GetStringUTFChars( instring, JNI_FALSE );
printf("Hello,%s\n" ,str);
// 通知虚拟机本地代码不再需要通过 str 访问 Java 字符串。
env->ReleaseStringUTFChars( instring, (const char *)str );
return ;
}

编译生成动态库

gcc -I /usr/java/jdk1.8.0_73/include/ -I /usr/java/jdk1.8.0_73/include/linux/  Hello.cpp -fPIC -shared -o Hello.so

注意

/usr/java/jdk1.8.0_73/include/
/usr/java/jdk1.8.0_73/include/linux/
这两目录根据自己的java jdk的安装目录而变。

所有文件

Hello.class  Hello.cpp  Hello.h  Hello.java  Hello.so

最后通知动态链接程序此共享文件的路径。

export LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH 

最后是java测试代码:

public   class  ToSay
{
public static void main(String argv[])
{
ToSay say = new ToSay();
}
public ToSay()
{
Hello h = new Hello();
// 调用本地方法向 John 问好
h.SayHello("John" );
}
}

用 javac 编译 ToSay.java,生成 ToSay.class 
向执行普通 Java 程序一样使用 java ToSay,我们会看到在屏幕上出现 Hello,John。