转自: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 " ,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。