Linux平台下使用JNI
2011-07-29 21:06
344 查看
1首先创建一个简单的java类:
publicclassHello
{
static
{
try
{
//此处即为本地方法所在链接库名
System.loadLibrary("hello");
}
catch(UnsatisfiedLinkErrore)
{
System.err.println("Cannotloadhellolibrary:\n"+
e.toString());
}
}
publicHello()
{
}
//声明的本地方法
publicnativevoidSayHello(StringstrName);
}
这里有个地方要注意,就是这个类最好不要加包信息。因为类在某个包下面,使用javah命令生成*.h头文件的时候会不一样,比如在test包下,就会生成test_Hello.h,而且在jni调用的时候,也有区别,为了方便起见,我们这里就不加包了,免得麻烦,:)
然后,编译得到Hello.class
2生成Hello.h
使用命令:javahHello
这里有一点要注意,如果这个命令报错,有可能是因为你没有当前路径到设置环境变量classpath中,所以:
javah-classpath"."Hello.class
这样写就OK了,后面也许还会碰到类似的环境变量问题。
3在与Hello.h相同的路径下创建一个CPP文件Hello.cpp。内容如下:
最后通知动态链接程序此共享文件的路径。
这里用
将如下源码存为ToSay.java:
[/code]
publicclassHello
{
static
{
try
{
//此处即为本地方法所在链接库名
System.loadLibrary("hello");
}
catch(UnsatisfiedLinkErrore)
{
System.err.println("Cannotloadhellolibrary:\n"+
e.toString());
}
}
publicHello()
{
}
//声明的本地方法
publicnativevoidSayHello(StringstrName);
}
这里有个地方要注意,就是这个类最好不要加包信息。因为类在某个包下面,使用javah命令生成*.h头文件的时候会不一样,比如在test包下,就会生成test_Hello.h,而且在jni调用的时候,也有区别,为了方便起见,我们这里就不加包了,免得麻烦,:)
然后,编译得到Hello.class
2生成Hello.h
使用命令:javahHello
这里有一点要注意,如果这个命令报错,有可能是因为你没有当前路径到设置环境变量classpath中,所以:
javah-classpath"."Hello.class
这样写就OK了,后面也许还会碰到类似的环境变量问题。
3在与Hello.h相同的路径下创建一个CPP文件Hello.cpp。内容如下:
#include"Hello.h" JNIEXPORTvoidJNICALLJava_Hello_SayHello(JNIEnv*env,jobjectarg,jstringinstring) { constchar*str=env->GetStringUTFChars(instring,JNI_FALSE); printf("Hello,%s\n",str); env->ReleaseStringUTFChars(instring,str); return; }
这个Hello.cpp的代码,跟IBM的例子略有不同,详细原因大家自己去查查jni.h
4.编译生成共享库
a.编译命令,生成Hello.o
g++-I/usr/lib/jvm/java-6-sun-1.6.0.03/include-I/usr/lib/jvm/java-6-sun-1.6.0.03/include/linux-fPIC-cHello.cpp
b.生成动态库文件,libhello.so.1.0
g++-shared-Wl,-soname,libhello.so.1-olibhello.so.1.0Hello.o
这里的2个命令也跟IBM文章的例子有所不同。因为使用gcc编译得到动态库,在jni调用的时候,某些情况会有异常,所以这里改用g++。
接下来将生成的共享库拷贝为标准文件名 [code]cplibhello.so.1.0libhello.so
最后通知动态链接程序此共享文件的路径。
exportLD_LIBRARY_PATH='pwd':$LD_LIBRARY_PATH
这里用
export加入共享文件的路径,有时候会有点问题,比如:环境变量不会马上更新等等。
还有一个办法,就是直接将libhello.so拷贝到/usr/lib或者/lib等系统库目录下
5.编写一个简单的Java程序来测试我们的本地方法。
将如下源码存为ToSay.java:
importHello; importjava.util.*; publicclassToSay { publicstaticvoidmain(Stringargv[]) { ToSaysay=newToSay(); } publicToSay() { Helloh=newHello(); //调用本地方法向John问好 h.SayHello("John"); } } 用javac编译ToSay.java,生成ToSay.class 向执行普通Java程序一样使用javaToSay,我们会看到在屏幕上出现Hello,John。 6以下是IBM的文章中的建议: 应用中注意事项 |
相关文章推荐
- Linux平台使用JNI的例子 Java调用so
- Linux平台Java调用so库-JNI使用例子
- Linux平台Java调用so库-JNI使用例子
- Linux平台Java调用so库-JNI使用例子
- 在Linux平台下使用JNI
- Linux平台Java调用so库-JNI使用例子
- 关于JNI的使用(实战linux平台下java调用本地c语言方法)
- 在Linux 平台下使用 JNI
- 在 Linux 平台下使用 JNI
- 在 Linux 平台下使用 JNI
- 在Linux平台下使用JNI
- 在 Linux 平台下使用 JNI
- 利用IDEA进行JNI开发:使用NDK生成Linux平台下的so文件
- 在 Linux 平台下使用 JNI
- 在 Linux 平台下使用 JNI
- 在Linux平台下使用JNI
- Linux平台Java调用so库-JNI使用例子
- 在Linux平台下使用JNI
- Linux平台Java调用so库-JNI使用例子
- 在 Linux 平台下使用 JNI