100求个问题 谢谢python调用java的问题

liangchengfck1 2013-03-22 09:44:59
python2.7
jpype2.7
我在MyEclipse8.5中建立了叫mytest的工程,工程里面有个test的.java文件或者说编译后的.class字节码文件这个都不是重点
java文件如下
package com;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;

public class test {
public String run(){

return "success";
}


public String run(String fileLnkName){

return fileLnkName;
}


public static String getLnkFile(File lnkFile) {
RandomAccessFile r = null;
ByteArrayOutputStream bos = null;
String filename = null;
try {
r = new RandomAccessFile(lnkFile, "r");
byte[] bys = new byte[4];

// 定位到 Shell item ID list 段的长度定义起始地址
// 以便于计算下一段(即文件位置信息段的起始地址)
r.seek(0x4c);
r.read(bys, 0, 2);
int offset = bytes2Int(bys, 0, 2);

// 获得文件位置信息段的起始地址
int fileLocationInfoSagement = offset + 0x4e;

// 获得本地路径信息段的起始地址
int filePathInfoSagement = fileLocationInfoSagement + 0x10;

// 定位到本地路径信息段,以便获得本地路径信息的偏移地址
r.seek(filePathInfoSagement);

// 获得本地路径信息的偏移
r.read(bys, 0, 4);
int filePathInfoOffset = fileLocationInfoSagement + bytes2Int(bys, 0, 4);

// 定位到本地路径信息起始地址,开始读取路径信息
r.seek(filePathInfoOffset);
bos = new ByteArrayOutputStream();
for(byte b = 0; (b = r.readByte()) != 0;) {
bos.write(b);
}
// 将读出路径信息字节存入 byte 数组中
bys = bos.toByteArray();

// 采用本地编码获得路径信息文件名称
filename = new String(bys);
} catch (IOException e) {
e.printStackTrace();
} finally {
if(bos != null) {
try {
bos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(r != null) {
try {
r.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return filename;
}

public static int bytes2Int(byte[] bys, int start, int len) {
int n = 0;
for(int i = start, k = start + len % 5; i < k; i++) {
n += (bys[i] & 0xff) << (i * 8);
}
return n;
}

}
python调用java代码如下
# -*- coding:utf8 -*-
import jpype
import os
#jvmpath是java虚拟机的位置
jarpath = os.path.join(os.path.abspath('.'), 'E:/Symantec/')
jpype.startJVM(jpype.getDefaultJVMPath(), "-Djava.ext.dirs=%s" % jarpath)
res = None
test = jpype.JClass('com.test')#com就是test所在包的位置 test在com包中
t = test()
#res = t.getLnkFile("C:\\Users\\aushelp5\\Desktop\\ASP.NET 3.5从入门到精通 - 快捷方式.lnk")
res=t.run('zhagnsan')#这句是调用test中run的重载方法 测试过是可以输出来结果的 也就是可以带参数
print res


#res = t.getLnkFile("C:\\Users\\aushelp5\\Desktop\\ASP.NET 3.5从入门到精通 - 快捷方式.lnk")这句被我注视掉了 这句是把快捷方式的的原文件地址查出来
getLnkFile方法我在MyEclipse测试过了是没问题的 可以我现在用python调用这个方法把快捷方式的地址放进去就报错了 如下
Traceback (most recent call last):
File "E:\Symantec\python_java.py", line 10, in <module>
res = t.getLnkFile("C:\\Users\\aushelp5\\Desktop\\ASP.NET 3.5从入门到精通 - 快捷方式.lnk")
RuntimeError: No matching overloads found. at src/native/common/jp_method.cpp:121
...全文
485 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
liangchengfck1 2013-03-25
  • 打赏
  • 举报
回复
终于可以了 原来是静态方法的问题 我调用的java里面的方法是个静态的方法,可以静态的方法也可以new实例后访问方法的啊 不知道为什么
liangchengfck1 2013-03-25
  • 打赏
  • 举报
回复
改了一下还是不行 代码如下
public static String getLnkFile(String file_path) { 
	File lnkFile = new File(file_path); 
}
//我现在穿进来的是string 然后再方法里面在穿进去file里面就ok了 测试了下没问题
public static void main(String[] args) {
test tt=new test();
System.out.print(tt.getLnkFile("C:\\Users\\aushelp5\\Desktop\\test.lnk"));
}
输出结果是 D:\test.xls
可是在python调用这个方法传进去一个字符串还是报错 而且错误还是一样 Traceback (most recent call last): File "E:\Symantec\python_java.py", line 10, in <module> res = t.getLnkFile("C:\\Users\\aushelp5\\Desktop\\test.lnk") RuntimeError: No matching overloads found. at src/native/common/jp_method.cpp:121 可是我python调用还是报错
liangchengfck1 2013-03-25
  • 打赏
  • 举报
回复
引用 3 楼 libralibra 的回复:
getLnkFile(File lnkFile) run(String fileLnkName) ============================== 你自己比较一下2个函数的参数,为什么一个失败一个成功不就清楚了吗? run接受字符串,当然成功,getLnkFile接受的是个File对象,你传个字符串进去,可能成功吗?要么重载getLnkFile函数接受字符串,自己处理,要么想办……
File file = new File("C:\\Users\\aushelp5\\Desktop\\test.lnk"); System.out.println(getLnkFile(file)); 你不说我还真的没注意,只顾着测试把路径传进去没想到还要new一下 谢谢
乔巴好萌 2013-03-22
  • 打赏
  • 举报
回复
print type(res)两个结果都一样? 不传快捷方式,传真实URL呢
libralibra 2013-03-22
  • 打赏
  • 举报
回复
getLnkFile(File lnkFile) run(String fileLnkName) ============================== 你自己比较一下2个函数的参数,为什么一个失败一个成功不就清楚了吗? run接受字符串,当然成功,getLnkFile接受的是个File对象,你传个字符串进去,可能成功吗?要么重载getLnkFile函数接受字符串,自己处理,要么想办法传个File对象进去(不知道python能不能构造一个java接受的File对象)
liangchengfck1 2013-03-22
  • 打赏
  • 举报
回复
引用 1 楼 openXMPP 的回复:
print type(res)两个结果都一样? 不传快捷方式,传真实URL呢
不行 根据快捷方式获得快捷方式的源文件 我调用java无参或者有参数的方法都可以 可是就是这个获得快捷方式源文件的路径方法不行,而且这个方法我在MyEclipse中测试是没问题的 哎 不制动啊问题出在什么地方了
# -*- coding:utf8 -*- 
import jpype 
import os 
#jvmpath是java虚拟机的位置 
jarpath = os.path.join(os.path.abspath('.'), 'E:/Symantec/') 
jpype.startJVM(jpype.getDefaultJVMPath(), "-Djava.ext.dirs=%s" % jarpath) 
res = None
test = jpype.JClass('com.test')#com就是test所在包的位置 test在com包中 
t = test() 
#res = t.getLnkFile("C:\\Users\\aushelp5\\Desktop\\ASP.NET 3.5从入门到精通 - 快捷方式.lnk") 
res=t.run('zhagnsan')#这句是调用test中run的重载方法 测试过是可以输出来结果的 也就是可以带参数 
print res
res=t.run('zhagnsan')测试没问题 可以调用到jar里面test类中run带参数的方法 而且输出ok res = t.getLnkFile("C:\\Users\\aushelp5\\Desktop\\ASP.NET 3.5从入门到精通 - 快捷方式.lnk")#这个失败 哎

37,743

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • WuKongSecurity@BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧