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
...全文
463 6 打赏 收藏 转发到动态 举报
写回复
用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")#这个失败 哎
本门课程是带大家进入微服务领域入门的课程,很适合新手小白学习的课程。1: 什么是rpc?RPC(Remote Procedure Call)是函数对函数的远程调用,传输协议tcp,http,主要是基于xml,json序列化协议(这里的序列化协议是对数据编解码的方式),项目中我们真正用到的是grpc,grpc是一个框架,基于http2.0的长链接,性能有所改进,重要的是grpc用的是Google开源的protobuf序列化协议,它比json,xml性能更快,在压缩数据方面也更小。总之我们选择grpc最主要的有两点:1:支持跨语言开发(如python,golang,java)2:  grpc首先是一个框架,封装rpc,让程序员只关注代码逻辑即可 2: 为什么用grpc,而不用flask,django,tornado,即http协议?1:http的调用是根据url的(即restful),它跟rpc的调用最大的区别就是这里,rpc的调用,你就像调用一个本地函数一样简单,而且微服务,分布式也是从rpc开始的,学好rpc对以后做好分布式会更有帮助,其实go语言和python语言里都有rpc(如xmlrpc,jsonrpc,zerorpc),我们之所以学习go语言里的rpc是因为go语言的rpc相对更加灵活,go语言本身也支持高并发,这一点对于分布式来说更好。2:其次http协议,用过flask框架的人都知道,请求一次数据后就断开,而grpc基于http2.0,它不但可以保持长链接,传输效率也更高,使用方面,因为http2.0相当于tcp一样使用,现在很多大厂也都开始用http2.0了。http2.0相比http的优势很明显,头部压缩,分流,针对tcp的多路复用。所以基于http2.0的grpc无论从生态和性能方面都更好。 这张图是一个gRPC相关的架构图,同学们可以通过这张图了解gRPC在项目中的使用。

37,719

社区成员

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

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