大家好,我是一个新人,目前遇到一个问题,搞了很久一直没有进展,希望高手指点。 
  这是项目中遇到的一个实际问题,我写了几个测试程序来描述这个问题: 
  1.首先我写了一个mysyscall.c文件,里面是一个与系统调用gethostname同样声明的函数,但是具体实现不一样; 
  2.然后写了一个Jload.java函数,里面有一个native 的方法call 
  3.通过JNI生成Jload.h文件,使用Jload.c去实现其中的方法Java_Jload_call,这个方法实现很简单,就是调用我上面写的gethostname方法。 
  4.将mysyscall.c,Jload.c一起生成一个动态库供java调用(gcc -shared -fpic -Wall -o libtest.so mysyscall.c Jload.c) 
  最后,运行java程序,但问题出现了,java程序并没有调用我自己写的gethostname,而是调到了系统调用,请问有什么方法可以解决吗 ?
  非常感谢!!!

解决方案 »

  1.   

    与系统调用gethostname同样声明的函数1换个函数名称.
    2指定路径
      

  2.   

    1.换个函数名称 :这只是几个测试文件,实际项目中我们使用第三方的动态库,不能更改函数名称
    2.指定路径 :可以说具体点吗?你指在java文件中?我是用的绝对路径加载啊System.load("...../libtest.so"),使用System.loadlibrary("test")也是一样的
     感谢楼上回复
      

  3.   

    你loadlibrary应该错了如果你的lib名字叫做libtest.so的话,那么你loadlibrary应该写:
    System.load("xxx/libtest")就好了。
    如果要动态设置xxx路径就自己设置-Djava.library.path=xxx就好了。
      

  4.   

    你loadlibrary应该错了如果你的lib名字叫做libtest.so的话,那么你loadlibrary应该写:
    System.load("xxx/test")就好了。
    如果要动态设置xxx路径就自己设置-Djava.library.path=xxx就好了。
      

  5.   

    不好意思,写错了。。
    应该是System.load("xxx/test")
    在linux下面会自动加上lib的,windows下面就不会了,windows下面就必须是test.dll才行。
      

  6.   

    你loadlibrary应该错了如果你的lib名字叫做libtest.so的话,那么你loadlibrary应该写: 
    System.load("xxx/libtest")就好了。 
    如果要动态设置xxx路径就自己设置-Djava.library.path=xxx就好了。
      

  7.   

    谢谢楼上回复,动态库libtest.so实际上是可以在程序中找到的,因为它毕竟还是调到了Java_Jload_call,只是Java_Jload_call中没有在调到库中的函数,而是转到了系统调用,另外设置-Djava.library.path也是没有效果的,它只是指明路径,并没有优先加载!