初学jni,一点心得...
编译环境eclipse, ubuntu
工程路径: src/com/cqb/hellojnitest
package com.cqb.hellojnitest;
public class HelloJniTest {
public native void displayHelloWorld();
static{
System.loadLibrary("hello");
}
public static void main(String[] args){
new HelloJniTest().displayHelloWorld();
}
}
1:进入src/ 目录,然后运行
javac com/cqb/hellojnitest/HelloJniTest.java
可以看到在相应的目录下生成了 HelloJniTest.class
或直接在.java文件所在的目录底下 javac
2: 在src/目录下 及工程包名package com.cqb.hellojnitest所在的目录下
javah com.cqb.hellojnitest.HelloJniTest
3: 接下在src目录下编辑所需要到的.c文件
#include <jni.h>
#include <stdio.h>
#include "com_cqb_hellojnitest_HelloJniTest.h"
JNIEXPORT void JNICALL Java_com_cqb_hellojnitest_HelloJniTest_displayHelloWorld
(JNIEnv *env, jobject obj)
{
printf("HelloWorld JNI!\n");
return;
}
4: 编译.c生成.so文件
gcc -shared -I /home/congqingbin/developEnvironment/jdk1.6.0_31/include -I /home/congqingbin/developEnvironment/jdk1.6.0_31/include/linux -I /usr/include com_cqb_hellojnitest_HelloJniTest.c -o libhello.so
.so名字的生成规则 一定是 lib+"java代码中导入的库的名字"(此例中为hello)+.so
-I参数是导入头文件,因为jni.h 和 jni_md.h不在默认的gcc头文件目录usr/include中
5:运行java com.cqb.hellojnitest.HelloJniTest会报错
Exception in thread "main" java.lang.UnsatisfiedLinkError: no hello in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1738)
at java.lang.Runtime.loadLibrary0(Runtime.java:823)
at java.lang.System.loadLibrary(System.java:1028)
at com.cqb.hellojnitest.HelloJniTest.<clinit>(HelloJniTest.java:6)
因为在默认的库路径找不到.so库
须导入库路径编译 java -Djava.library.path=. com.cqb.hellojnitest.HelloJniTest
运行结果如下
:~/workspace/JNIHelloTest/src$ java -Djava.library.path=. com.cqb.hellojnitest
HelloJniTestHelloWorld JNI!