当前位置:  技术问答>linux和unix

unix 下 java 调用c 然后c再调用c 怎么实现,请给点意见

    来源: 互联网  发布时间:2016-05-27

    本文导语:  清单 1. HelloWorld.java class HelloWorld {    public native void displayHelloWorld();       static {          System.loadLibrary("hello");       }       public static void main(String[] args) {         new HelloWorld().displayHe...

清单 1. HelloWorld.java

class HelloWorld {

   public native void displayHelloWorld();
      static {
         System.loadLibrary("hello");
      }

      public static void main(String[] args) {
        new HelloWorld().displayHelloWorld();
      }


清单 2.  HelloWorld.c

#include 
#include "HelloWorld.h"
#include 
JNIEXPORT void JNICALL
/*另一个c文件中的方法*/
extern void helloTest();

static void *gmod;
static void (*gfunc)();
Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj)
{
    gmod = dlopen("helloworld.so", "RTLD_LAZY");
    gfunc = (void(*)())dlsym(gmod, "helloTest");
    return;


清单 3.  Hello.c

void helloTest() {
   printf("Hello world!n");
   return;
}

注:以上三个文件放到同一个目录.
(1):编译java文件,生成class文件:运行javac HelloWorld.java
(2):根据class文件生成C语言的头文件:javah HelloWorld,生成HelloWorld.h
(3):根据hello.c生成helloworld.so文件:gcc hello.c –shared –o helloworld.so
(4):根据hello.c生成helloworld.so文件:gcc HelloWorld.c –shared –o hello.so
(5):运行java文件:java –Djava.library.path=. HelloWorld

以上是我的执行步骤,但是不成功,不知道什么原因。请各位给点意见,不胜感激。
当java单纯调用c时候是可以成功的。以下代码是java单纯调用c时候可以调用成功:
清单 1. HelloWorld.java

class HelloWorld {
   /* Native method declaration */
   public native void displayHelloWorld();
     /* Use static intializer */
      static {
         System.loadLibrary("hello");
      }
      /* Main function calls native method*/
      public static void main(String[] args) {
        new HelloWorld().displayHelloWorld();
      }




清单 2. HelloWorld.c

#include 
#include "HelloWorld.h"
#include 
JNIEXPORT void JNICALL
Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj)
{
    printf("Hello world!n");
    return;




|
HelloWorld.c文件代码修改如下

#include "HelloWorld.h" 
#include 

static void *gmod; 
static void (*gfunc)();
 
JNIEXPORT void JNICALL 
Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj) 

    gmod = dlopen("./libhelloworld.so", RTLD_LAZY);  /* 这里的参数需要改动 */
    gfunc = (void(*)())dlsym(gmod, "helloTest");
    gfunc(); /* 总要调用下吧 */
    return; 



(1): 编译java文件,生成class文件:运行javac HelloWorld.java                      [对的]
(2): 根据class文件生成C语言的头文件:javah HelloWorld,生成HelloWorld.h           [对的]
(3): 根据HelloWorld.c生成libhello.so文件: gcc –shared -I. –o libhello.so HelloWorld.c    [我修改过的,自己对比下吧,这里的命名很重要]
(4): 根据hello.c生成libhelloworld.so文件: gcc –shared –o libhelloworld.so hello.c    [我修改过的]
(5):运行java文件:java –Djava.library.path=. HelloWorld                       [对的]


说明:
    在Linux下的库文件命名,有自己的规则,不是随便起名的。例如,如果你想生成一个名为hello的动态库,那么你需要把它命名为libhello.so,这样以后你就可以在编译程序的时候 -lhello 这样使用它了。这也正是System.loadLibrary("hello"); 为什么能正确加载libhello.so的原因。

    
 
 

您可能感兴趣的文章:

  • 执行一个main函数程序时,unix操作系统调用什么创建进程?fork?newproc?
  • 如何远程调用unix主机上的命令?
  • 关于unix系统调用的问题
  • 那位大虾帮忙解释一下,为什么调用unix命令失败
  • unix程序中调用其他程序的问题
  • LuaJIT 的 Unix 系统调用库 Ljsyscall
  • 如何在unix下调用Ftp并为其传参数?
  • 在Java中如何调用Unix系统的crypt()函数?
  • java 下如何调用 window or unix 下的可执行程序
  • pc文件中如何调用unix命令
  • UNIX下如何调用webservice
  • UNIX 操作系统中进程之间调用的通信方式
  • unix(Sun OS)下调用.so的问题
  • 急!重分相谢!UNIX下如何判断system调用ftp成功?
  • 提问,unix下C语言如何调用xml文件,不够再加分
  • Unix环境下,c++如何调用java写的webservice?
  • Unix下System函数实现中为何要使用shell去调用执行程序?
  • unix 下web应用程序调用 一个写数据库的perl脚本 的问题。
  • 请问在Unix下开发ftp传输模块,有没有什么系统函数可以调用。
  • 以普通用户的身份登陆到unix,能不能调用shell执行特定的操作?
  • 如何用lilo实现linux与Unix并存? iis7站长之家
  • 请各位给点参考意见...我只有3个月时间学习UNIX,该学些什么?
  • 新手想做一个数据库函数库作练习,是仿照《unix高级环境编程〉的那个例,书上是非集中式的,不过我想搞集中式的,麻烦大家给个意见
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Linux和Unix相对WIN、NETWARE有什么好处?他们之间有什么区别?WIN、NETWARE能实现的功能LINUX和UNIX能实现吗?
  • 用oracle pl/sql 从A unix机器,去读取B unix机器上的一个文件,怎么实现?
  • 求助批处理实现dos -〉unix文件的转换,要将^M 替换为unix回车
  • 如何在UNIX/LINUX下实现数据包拦截?
  • 如何用lilo实现linux与Unix并存?
  • unix .sh文件系统启动时如何实现自动启动
  • 如何实现Unix/linux服务器之间文件的相互共享?
  • 如何用vb来实现对unix系统的简单操作?
  • 在Sco Unix下如何实现定时关机的功能?
  • unix的进程pooling是如何实现的
  • unix下有没有像window 下的dll一类的东西?来实现程序的封装。
  • unix系统可以实现对文件的重命名吗?
  • 如何实现在unix下delphi与java的相互加密解密??求救???
  • 请教一下:在UNIX下怎样实现和Windows下“计划任务”一样的功能。
  • 在UNIX下用c/c++怎么能实现大数据文件的快速读写?
  • 我在windows2000下面访问局域网的hp unix什么命令能实现
  • 模拟unix文件系统的设计及实现???
  • 请问在unix下如何用c实现ftp的自动上下传文件,急!!!
  • 请教高手:Unix下如何实现进程池?
  • UNIX SHELL实现su用户切换功能
  • java命名空间java.util.regex类pattern的类成员方法: unix_lines定义及介绍
  • 刚刚接触Unix系统和Unix编程。急需Unix下多线程程序设计和网络Socket程序设计方面的资料。
  • unix/Linux下c++ boost thread库读写锁介绍
  • 关于UNIX的历史 : 1973年,K.Thompson和D.M.ritchie,用C改写UNIX。那么,在此之前,UNIX是用什么写的?
  • php将标准字符串格式时间转换成unix时间戳_strtotime
  • 没有unix系统我如何学习unix
  • php将unix时间戳转换成字符串时间函数(date)
  • unix盘哪里有下载的??哪里有比较好的unix论坛??万分感谢!!!!!!!!!
  • unix/Linux下c/c++ pthread库读写锁函数介绍
  • 急!装完unix5.06,再装win2000。重启后不能进unix.
  • UNIX特急!!!digital unix问题,请专家快来!!!


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3