摘要: Jvm封装了各种操作系统实际的差异性的同时,提供了jni技术,使得开发者可以通过java程序(代码)调用到操作系统相关的技术实现的库函数,从而与其他技术和系统交互,使用其他技术实现的系统的功能;同时其他技术和系统也可以通过jni提供的相应原生接口开调用java应用系统内部实现的功能。 JNI是JAVA标准平台中的一个重要功能,它弥补了JAVA的与平台无关这一重大优点的不足,在JAVA实现跨平台的同时,也能与其它语言(如C、C++)的动态库进行交互,给其它语言发挥优势的机会。 Jni对于应用本身来说,可以看做一个代理模式。对于开发者来说,需要使用c/c++来实现一个代理程序(jni程序)来... 阅读全文
posted @ 2014-04-11 16:41 深谷芝兰 阅读(1759) 评论(0) 推荐(0) 编辑
摘要: Java不能直接调用由c或者c++写得dll(TF_ID.dll),所以只能采用jni得方法,一步一步生成符合规范得dll文件(假设叫FANGJIAN.dll),在FANGJIAN.dll这个文件里来调用TF_ID.dll。注意一点:两个dll文件不能重名,为什么呢?因为java后来执行时候,必须把两个dll文件均考到java得class文件同一目录下,或者把TF_ID.dll考到system32下也可以,如果重名得话,首先不能考到一个目录下,再则即使将前一个dll考到system32下,那么后一个dll也会出现调用自身dll得问题,大家可想而知了!!!下面给出了两个例子:第一个是用java得 阅读全文
posted @ 2014-04-11 16:40 深谷芝兰 阅读(2867) 评论(0) 推荐(0) 编辑
摘要: 好不容易使用cygwin+windows打了个包,放到JAVA中使用。但是还是会报各种错。JAVA中使用.so文件static{System.loadLibrary("test");//加载libtest.so}以上是网上的经典用法,很简单的一句。但是用的时候还是出错了。。。主要还是.so路径找不到。找了大半天,终于,问题解决了。原因是:windows下loadLibrary只能用来加载.dll, 可以使用 System.load("完整路径+完整文件名") 来加载(android程序最终是要放到手机上linux环境运行的,所以加载.so是没有问题的。) 阅读全文
posted @ 2014-04-11 16:37 深谷芝兰 阅读(3968) 评论(0) 推荐(0) 编辑
摘要: 写一个JNI Test.1、java中声明 native func2、使用javah 将.class编译得到 .h3、编写.c4、打包成.so 动态库5、JAVA中使用加载.so 然后就可以使用native方法了。其他步骤问题不大,在打包上卡住了。一个helloWorld打包的话,只需要-------------------------------------1: gcc -c helloWorld -o hello.o2: gcc -shared libhello.so hello.o(简单的linux编译相关命令http://blog.sina.com.cn/s/blog_4057ab62 阅读全文
posted @ 2014-04-11 16:36 深谷芝兰 阅读(801) 评论(0) 推荐(0) 编辑