调用C语言

三个步骤:

1、编写好c语言程序

2、将c程序编译成.so文件

3、编写python,使用python运行

 

第一步,写一个c语言文件

#include<stdio.h>
   int test()
  {
  printf("hello,world");
  }

第二步,将编写的C代码编译成动态链接库的形式,打开cmd,cd路径到add.c所在目录下方,然后输入:

gcc --shared -fpic -o add.so add.c

每个平台将c文件编译成so文件的命令都不同,我这个是windows下的命令。其它的例如Linux等OS命令请自行查询命令资料。

第三步、在hello.py中导入动态链接库,并调用C函数

这里的ctypes是Python的一个外部库,提供和C语言兼容的数据类型,以方便的调用C编译的静态库和动态库中的函数, 在此可以很肯定的说,ctypes中可定对C的数据类型进行了转换,使用时只需import ctypes ,然后导入动态库即可。

ctypes详细介绍http://www.92to.com/bangong/2016/08-08/9334057.html

import ctypes  
lib = ctypes.cdll.LoadLibrary('./libhello.so')    
lib.test()

在终端下输入Python hello.py, 运行结果:

打印出hello.c中的内容, 说明Python调用C模块成功!

调用java语言

安装

python -m pip install jpype1

pythonIDE

python3.6 
java1.8 
eclipse4.6.3 PyDev(python在eclipse插件) 

HelloWord

  • 设置参数启动Java虚拟机
  • 运行Java代码
  • 关闭虚拟机
#coding=utf=8
import jpype
jvmPath = jpype.getDefaultJVMPath() # 获得系统的jvm路径
jpype.startJVM(jvm=jvmPath) # 启动虚拟机
# 执行JAVA代码
jpype.java.lang.System.out.println("hello world")
jpype.shutdownJVM() # 关闭jvm
  • 使用Java中的对象

第一种:jpype支持直接使用Java编译后的class文件。

package com;
public class JavaClass
{
    String value;
    public JavaClass(String value)
    { 
        this.value = value+" Java"; 
    } 
    public String getValue()
    { 
        return this.value;
    }
    public void say()
    {
        System.out.println("hello java");
    }
    public static void main(String[] args) {
        System.out.println("hello world");    
    }
 }

随后生成class文件

python代码

#coding=utf=8
import jpype
# 获得系统的jvm路径
jvmPath = jpype.getDefaultJVMPath() 
# 启动虚拟机
if not jpype.isJVMStarted():
    jpype.startJVM(jvm=jvmPath)
# 使用JAVA字节码中定义的类
javaClass = jpype.JClass('com.JavaClass')
# 实例化对象
javaInstance = javaClass('test')
#调用JAVA对象的方法
print (javaInstance.getValue())
javaInstance.say()
# 关闭jvm
jpype.shutdownJVM()

 

第二种:jpype也支持直接使用Java程序打包后的jar文件。 
教大家一种打包的方法,我以前是写web前端的,用习惯了eclipse,所以我的python工具也是eclipse,感兴趣的可以跳到我配置eclipse+python环境的博客。

我们在eclipse编写完java程序后呢,在自己程序的包上面 右键 菜单中有一个 Export 的功能,点击完之后,就可以选择输出格式和路径了,我这里选择的是 java – JAR file

package test;  
public class Test1  
{  
    public String getKey(String key){  
        return key;  
    }  
    public void printData(String key){  
        System.out.println(key);  
    }  

    public static void main(String[] args)  
    {  
        System.out.println(456);  
    }  
}

python代码

import jpype
#获取系统jvm路径
jvmPath = jpype.getDefaultJVMPath()
# 用来添加JAVA虚拟机命令行参数
ext_classpath = './Test1.jar'
jvmArg = '-Djava.class.path=' + ext_classpath
if not jpype.isJVMStarted():
    jpype.startJVM(jvmPath, jvmArg)
    TA = jpype.JPackage('test').Test1 #这种用法可以简化后面的书写
    jd = TA()
    jd.printData('1234')
    s = jd.getkey('a')
    print (s)
    system = jpype.java.lang.System #直接获取java内置输出实例
    system.out.println("call system method")
jpype.shutdownJVM()

 

 

 


本文转载:CSDN博客