在linux下进行JNI开发
前期准备:
1、Java JDK
2、gcc
3、g++
注意:gcc和g++的版本号要一致:如下:
[qiaoning@qiaoning ~]$ gcc --version gcc (GCC) <span style="color: #ff0000;">4.6.3 20120306 (Red Hat 4.6.3-2)</span> Copyright (C) 2011 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. [qiaoning@qiaoning ~]$ g++ --version bash: g++: command not found... [qiaoning@qiaoning ~]$ gcc --version gcc (GCC) <span style="color: #ff0000;">4.6.3 20120306 (Red Hat 4.6.3-2)</span> Copyright (C) 2011 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
?
linux(Fedora) 安装gcc yum install gcc 安装g++ yum install
gcc-c++
确保上述准备工作完成后开始下边的工作:
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 ; }
?
接下来编译生成共享库:
Plain代码
-
gcc?-I/usr/lib/jvm/java-
1.6
.
0
-openjdk-
1.6
.
0.0
/include?-I/usr/lib/jvm/java-
1.6
.
0
-openjdk-
1.6
.
0.0
/include/linux?-fPIC?-c?Hello.cpp??
注意:这儿可能产生的错误:
1、
Plain代码
-
gcc:?error?trying?to?exec?
‘cc1plus’
:?execvp:?No?such?file?or?directory??
原因:没有安装g++,或者gcc和g++的版本不一致
2、