BirdsHover

——路漫漫其修远兮,吾将上下而爬楼梯!

  BlogJava :: 首页 ::  :: 联系 :: 聚合  :: 管理 ::
  21 随笔 :: 8 文章 :: 34 评论 :: 0 Trackbacks
这个问题比较急,借用首页发一下,谢谢!

最近需要对一个C++库进行封装,为简单起见决定使用JAVA对其封装。但是一直调用不成功,于是写了一段测试代码测试一下。为简单起见,就使用默认包了。

public class TestDLL {
    
public native String Test(String put);
    
    
static{
        System.loadLibrary(
"testdll");
    }
    
    
public static void main(String[] args) {    
        TestDLL test 
= new TestDLL();
        System.out.println(test.Test(
new Date().toString()));
    }
}

然后生成了C++头文件

/* DO NOT EDIT THIS FILE - it is machine generated */
#include 
<jni.h>
/* Header for class TestDLL */

#ifndef _Included_TestDLL
#define _Included_TestDLL
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     TestDLL
 * Method:    Test
 * Signature: (Ljava/lang/String;)Ljava/lang/String;
 
*/
JNIEXPORT jstring JNICALL Java_TestDLL_Test
  (JNIEnv 
*, jobject, jstring);

#ifdef __cplusplus
}
#endif
#endif

下面是简单的实现
#include "TestDLL.h"

JNIEXPORT jstring JNICALL Java_TestDLL_Test
  (JNIEnv 
*, jobject, jstring put){
      
return put;
}

在linux下通过gcc编译后,java调用:
java -Djava.library.path=/home/xp -cp . TestDLL

一直报错:

Exception in thread "main" java.lang.UnsatisfiedLinkError: no testdll in java.library.path
        at java.lang.ClassLoader.loadLibrary(ClassLoader.java:
1734)
        at java.lang.Runtime.loadLibrary0(Runtime.java:
823)
        at java.lang.System.loadLibrary(System.java:
1028)
        at TestDLL.main(TestDLL.java:
27)

但是我在windows下编译了testdll.dll后,能够调用正常。

接着我改写为System.load("/home/xp/testdll.so");结果可以在linux使用了,希望有经验的朋友可以解答我的疑问。


posted on 2010-04-28 18:11 Birdshover 阅读(1814) 评论(8)  编辑  收藏

评论

# re: 一个JNI的问题请教 2010-04-28 19:04 美食天下
学习中...  回复  更多评论
  

# re: 一个JNI的问题请教 2010-04-28 20:00
在Linux下是so文件,没有dll文件的概念的。
dll是只在windows下使用的。】

所以在Windows下编译成dll文件,而在Linux下需要编译成so文件。

应该是这样的。我还没写过jni呢,倒是用了挺多的。。。。  回复  更多评论
  

# re: 一个JNI的问题请教 2010-04-28 20:04 kalman03

“但是我在windows下编译了testdll.dll后,能够调用正常。

接着我改写为System.load("/home/xp/testdll.so");结果可以在 linux使用了”

在windows上和linux上都正常,还有什么问题?
难道是楼上说的情况?  回复  更多评论
  

# re: 一个JNI的问题请教 2010-04-28 20:13 隔叶黄莺
不需要写 .dll 还是 so,程序会根据平台决定是哪一类型文件
还就是要了解动态库会依次从哪里找,
一般是 当前目录,系统目录,环境中的 LIB 目录  回复  更多评论
  

# re: 一个JNI的问题请教 2010-04-29 08:58 香草
别说你是用Win环境的C编辑器得到的文件放在linux下运行 ?  回复  更多评论
  

# re: 一个JNI的问题请教 2010-04-29 09:22 jacky_zz
问题是在Windows用gcc编译的时候,如果没有指定用参数编译为Windows平台的dll,那么gcc会在导出符号前加下划线“_”,这样在Windows下就不能找到对应的导出符号了,所以你需要在编译的时候指定参数:
-Wl,--add-stdcall-alias和-Wl,--kill-at来去掉导出符号前的下划线,以及导出符号中的@字符。  回复  更多评论
  

# re: 一个JNI的问题请教 2010-04-29 20:44

@隔叶黄莺
像这位达人所说的。可以不用写dll和so也可以。
Java有两种方法加载:
System.load和System.loadLibrary
后面那个方法只要写你的文件名就可以了如:System.loadLibrary(testdll) ——没有后缀的。记得把testdll那个文件放到path目录下
System.load参数要带绝对路径,且文件要有后缀  回复  更多评论
  

# re: 一个JNI的问题请教 2010-04-30 12:10 凡客诚品专卖店
阿克苏开得久空间撒旦  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航:
博客园   IT新闻   Chat2DB   C++博客   博问