首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > perl python >

100求个有关问题 多谢python调用java的有关问题

2013-03-28 
100求个问题 谢谢python调用java的问题python2.7jpype2.7我在MyEclipse8.5中建立了叫mytest的工程,工程里

100求个问题 谢谢python调用java的问题
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


[解决办法]
getLnkFile(File lnkFile)
run(String fileLnkName)
==============================
你自己比较一下2个函数的参数,为什么一个失败一个成功不就清楚了吗?
run接受字符串,当然成功,getLnkFile接受的是个File对象,你传个字符串进去,可能成功吗?要么重载getLnkFile函数接受字符串,自己处理,要么想办法传个File对象进去(不知道python能不能构造一个java接受的File对象)

热点排行