100求个问题 谢谢python调用java的问题
python2.7
jpype2.7
我在MyEclipse8.5中建立了叫mytest的工程,工程里面有个test的.java文件或者说编译后的.class字节码文件这个都不是重点
java文件如下
package com;python调用java代码如下
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;
}
}
# -*- 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
[解决办法]
getLnkFile(File lnkFile)
run(String fileLnkName)
==============================
你自己比较一下2个函数的参数,为什么一个失败一个成功不就清楚了吗?
run接受字符串,当然成功,getLnkFile接受的是个File对象,你传个字符串进去,可能成功吗?要么重载getLnkFile函数接受字符串,自己处理,要么想办法传个File对象进去(不知道python能不能构造一个java接受的File对象)