提取C++库函数的代码(java)

Java中调用C库函数 写在最前面 Java中调用C库函数,依赖JNI,本文使用一个非常简单的例子来说明JNI开发流程,具体步骤如下: 第一步:编写Java代码 第二步:编译Java代码 第三步:生成C语言头文件 第四步:编写C代码 第五步:生成C共享库 第六步:运行Java程序 注:本文中将仅在Java代码中声明的方法称为本地方法,使用C/C++实现的函数称为本地函数。 第一步:编写Java代 阅读详情

 

闲来无事,写了一个提取C++库函数的代码,没有仔细测试。

package edu.kevin.regular;

import java.io.*;
import java.util.*;
import java.util.regex.*;

public class SrcAnalyze {

    
private String srcDir;

    
private HashSet allAPI;

    
private HashSet inAPI;

    
private Pattern pt;

    
public SrcAnalyze(String dir) {
        srcDir 
= dir;
        allAPI 
= new HashSet(1000);
        inAPI 
= new HashSet(1000);
        
//抽取C++的库函数调用
        pt = Pattern.compile("(/b+)(/w+)/([^/)]*/)(/s*(/{)|[^/{])");
    }


    
public void extract() {

        Date start 
= new Date();
        
long startTime = start.getTime();

        extDir(srcDir);

        
for (Object hs : inAPI) {
            
if (allAPI.contains(hs)) {
                allAPI.remove(hs);
            }

        }


        Date end 
= new Date();
        
long endTime = end.getTime();
        
//计算程序运行时间
        System.out.println("Time: " + (endTime - startTime) + "ms");
    }


        
//遍历指定目录(包括子文件夹)
    private void extDir(String strPath) {
        File dir 
= new File(strPath);
        File[] files 
= dir.listFiles();

        
if (files == null)
            
return;
        
for (File fl : files) {
            
if (fl.isDirectory()) {
                extDir(fl.getAbsolutePath());
            }
 else {
                String strFileName 
= fl.getAbsolutePath();
                
if (strFileName.matches("^.+/.([cChH]|(cpp))$"))
                    readFile(strFileName);
            }

        }


    }


    
private void readFile(String filename) {
        
try {
            BufferedReader in 
= new BufferedReader(new FileReader(filename));
            String s 
= null;
            StringBuffer tmp 
= new StringBuffer("");
            
//删除所有的注释(单行的双行的)
            while ((s = in.readLine()) != null) {
                
if (!(s.matches("^/s*//*.+$"))) {
                    
// get rid of comment like "//..."(Single Line)
                    tmp.append(s.replaceAll(""[^"]*"", "").replaceAll(
                            
"//.+$", ""));
                }
 else {
                    
// get rid of comment like "/*...*/"(Multi-Lines)
                    if (!(s.matches("^.+/*/$"))) {
                        
while ((s = in.readLine()) != null) {
                            
if (s.matches("^.+/*/$"))
                                
break;
                        }

                    }

                }

            }

            in.close();
            
//抽取库函数调用
            extMethod(tmp);
        }
 catch (IOException e) {
            System.out.println(e.toString());
        }

    }


        /
/抽取库函数调用
    private void extMethod(StringBuffer src) {

        
int i = 0, j = 0;
        String tmp;

        
// internal API
        Matcher m = pt.matcher(src);

        
while (m.find()) {
            tmp 
= m.group(2);
            
if (!tmp.equals("if") && !tmp.equals("for") && !tmp.equals("while")
                    
&& !tmp.equals("switch") && !tmp.equals("return")) {
                allAPI.add(tmp);
                
if (m.group(4) != null)
                    inAPI.add(tmp);
            }

        }


    }


    
public void print() {

        System.out.println(
"+++++++++++++++++++++++++++++++++++++++");

        Object[] allAPI_List 
= allAPI.toArray();
        Arrays.sort(allAPI_List);
        
for (Object all : allAPI_List)
            System.out.println(all);

        System.out.println(
"+++++++++++++++++++++++++++++++++++++++");

    }


    
public static void main(String[] args) {
        SrcAnalyze test 
= new SrcAnalyze("D:/Test");
        test.extract();
        test.print();
    }


}

 
Java 调用 Cpp 代码简单示例 前言:首先说明一下,本篇文章是干嘛的,简单来说就是在 Java 代码里调用 C++ 代码。但是呢,这里只做一个简单的示例,调用最简单的 C++ 代码,起到一个抛砖引玉的作用。如有不对之处,望大家指正之。 阅读详情

相关推荐

【log4】c++日志工具之——log4cpp

1、log4cpp概述 Log4cpp是一个开源的C++类库,它提供了C++程序中使用日志和跟踪调试的功能,它的优点如下: 提供应用程序运行上下文,方便跟踪调试; 可扩展的、多种方式记录日志,包括命令行、文件、回卷文件、内存、syslog服务器、Win事件日志等; 可以动态控制日志记录级别,在效率和功能中进行调整; 所有配置可以通过配置文件进行动态调整; 多语言支持,包括Java(log4j),C++(log4cpp、log4cplus),C(log4c),python(...

我的笔记本 8054

在Java中调用C++函数

在Java中调用C++函数 文章目录在Java中调用C++函数环境的搭建预备知识的学习1 JNI的认识2.JNI的使用3.Demo的制作3.1 创建使用的Java类并进行编译3.2 创建C++函数3.3动态链接库(dll)概述静态库和动态库3.4运行 环境的搭建 开发环境为 IDEA Clion(后改用VS ) 预备知识的学习 1 JNI的认识 JNI是Java Native Interface的...

qq_40293731的博客 1456

c++ 利用yaml-cpp读写yaml配置文件

在程序员的开发生涯中,读写配置文件必不可少。 配置文件有利于我们灵活配置工程,解决大量重复劳动,也方便调试。 配置文件的格式有很多,最简单的有一行一行的文本,也有像 json、xml、protocol buffer 这样结构化的格式,当然也有 yaml 这种格式。 今天的博文介绍的是如何在 C++ 开发中利用 yaml-cpp 开源库读写 yaml 配置文件。 如果有 Python 开发经验的同学,可能知道用 Python 读取 yaml 是再简单不过了,但是 C++ 麻烦一点,它需要你自己下载源码然后编译

newbeixue的博客 4017

c/c++语言库函数查询方法(详解)

话不多说,步入正题: 我们参照文档,来学习几个库函数;(教会你怎么使用文档来学习库函数)。 strcpy char * strcpy(char * destination, const char * source); memset void * memset ( void * ptr, int value, size_t num); 这里对新接触c语言的同学我们推荐一个查库函数比较好用的网站点击这里。 打开网站我们查找输入我们向了解的函数,拿我们上边的strcpy来举例子吧。 .

weixin_51503720的博客 8795

log4cpp 详解及使用操作

Log4cpp是一个开源的C++类库,它提供了在C++程序中使用日志和跟踪调试的功能。使用log4cpp,可以很便利地将日志或者跟踪调试信息写入字符流、内存字符串队列、文件、回滚文件、调试器、Windows日志、本地syslog和远程syslog服务器中。 1、Log4cpp简介   Log4cpp是个基于LGPL的开源项目,移植自Java的日志处理跟踪项目log4j,并保持了API上的一致。...

Zhanganliu的博客 7148

C++去除cpp文件的注释

问题:读取一个cpp文件,去除其中所有的单行注释(//)和多行注释(/**/),将去除注释后的内容写入一个新文件。 注意: 不能去除字符串中的任何字符,如 "asdf//gh/**/k" 需要原样输出 能够识别转义的双引号(\")和非转义的双引号("),如: '\"'(单引号中的转义双引号字符) "asdf\"" (字符串中的转义双引号不能表示字符串结束) \"aaa"bcdef"(同理,转义双引号不能表示字符串开始) 命令行参数为: 参数1:原文件名 参数2:新文件名 ...

m0_62505136的博客 2708

c++代码转为go_跨平台C++开源代码的两种常用编译方式-Go语言中文社区

作者:朱金灿跨平台C++开源代码为适应各种编译器的编译,采用了两种方式方面来适配。一种是makefile方式。以著名的空间数据格式解析库gdal为例,它就是提供了makefile来供各种编译器来编译。gdal主要提供了微软的VC编译器和GNU GCC编译器两种格式的makefile,在gdal的源码根目录可以找到makefile.vc和GNUmakefile两个makefile文件,其中makef...

weixin_39962394的博客 284

C++库函数及STL算法

C++库函数及STL算法(英文版)介绍及用法 每个函数都有简单的源文件说明,有例子

C++ 提取代码中的函数

输入一段代码,输出这段代码中包含的所有函数 #include<iostream> #include<fstream> #include<cstring> #include<cmath> using namespace std; int total;//行数 //初始化数组为空 string str[10000]="";//预处理的数据 string str1[10000]="";//处理后数据 string temp[1000]=""; .

海月的博客 1964

c++内容提取工具

c++文件内容提取工具,非常好用,希望对您有所帮助!

STL源代码 c++标准库函数 源码

源码之前,了无秘密.详细看过STL源码的人都有这种感受吧. 本资源为STLPort4.0源代码.

c++函数重载流提取和流插入

c++函数重载operator>

btzxlin的博客 269

C++ 库函数(库函数 查询手册)

这是我心仪已久的一本书 我相信很多读者也有同样的感受 在所有的编程语言中 C++可以说是最为复杂的 它既是一门传统的编程语言 新的编程语言 说它是一门传统语言 是因为 C++诞生已将近 20 年的历史了 特别 年来 C++得到了快速的发展 C++是计算机软件领域中覆盖面最为广阔的编程语言 C++相关的智力投入也是其他任何一门语言所无法比拟的 人们对于 C++的研究已经 了对于一门编程语言所应有的关注 所以 现在的 C++已经非常成熟 有大量的资源 书籍 源代码等等 可供我们使用 说 C++是一门新的编程语言 是因为在 1998 年 International Standards Organization 完成了标准化 从此 C++领域有了统一的 有的编译器都将向标准靠拢 或者说 与标准兼容 这有利于我们写出可移植的 C 同时 C++标准也统一了 C++标准库 为 C++用户提供了最为基本的基础设施 C++经 的发展 终于有了一个相对稳定的版本 所以 我们应该用一种新的眼光来看待 C+ 简单地把 C++认为是 C 语言的超集 本书正是新版本 C++的写照 通过本书 你可以 C++语言 这是我翻译过程中最为真切的体会 它纠正了我过去对于 C++语言的一些 然我从 1993 年开始就一直在使用 C++ 但是直到阅读了这本书之后 我才从真正意 地认识了 C++语言

c++ 开发中利用yaml-cpp读写yaml配置文件

在程序员的开发生涯中,读写配置文件必不可少。 配置文件有利于我们灵活配置工程,解决大量重复劳动,也方便调试。 配置文件的格式有很多,最简单的有一行一行的文本,也有像 json、xml、protocol buffer 这样结构化的格式,当然也有 yaml 这种格式。 今天的博文介绍的是如何在 C++ 开发中利用 yaml-cpp 开源库读写 yaml 配置文件。 如果有 Python 开发经验的同学...

frank 的专栏 6万+

openssl库已经编译的文件

这个库已经编译好了 可以直接调用!各种加密函数齐全的。

地震数据可视化必备:5分钟读懂SEGY道头字段全解析(含坐标定位指南)

本文深入解析了SEGY文件格式中道头坐标字段的提取与可视化方法。针对地震数据处理中的常见痛点,详细介绍了sx/sy、gx/gy等关键坐标字段的二进制解析、比例因子应用、单位转换及常见问题解决方案,并提供了实用的Python代码示例,帮助开发者实现从SEGY文件到三维空间可视化的完整流程。

echo99的专栏 1012

JAVA VS CPP Benchmark

第一组测试计算 max是:4234567890 max*max nonprint是把 printf("%ld\n", res); 去掉的意思 代码结构大概是这样的: #include #include #include #include int main(int argc, char** argv) { int op = atoi(argv[1]);

ang639 2049

玄机-Linux权限维持-后门

玄机-Linux权限维持-后门

m0_46439803的博客 767

从 C/C++ 程序调用 Java 代码

JNI允许您从本机代码内调用 Java 类方法。 要做到这一点,通常必须使用 Invocation API 在本机代码内创建和初始化一个 JVM。 下列是您可能决定从 C/C++ 代码调用Java 代码的典型情况:     1.希望实现的这部分代码是平台无关的,它将用于跨多种平台使用的功能。     2.需要在本机应用程序中访问用 Java 语言编写的代码或代码库。     3.希望从本

老徐2014 2万+

NXP ChessDE的安装和激活

如果客户申请的是试用版,那么一份为期 30 天的 License 将会发送申请人的账号或邮箱中,客户使用该文件进行安装即可。② 将“VENDOR snpslmd /path/to/snpslmd”中的“/path/to/snpslmd”替换成 snpslmd.exe 实际存放路径(位于 SCL 安装目录下的 win32\bin 文件夹中,默认安装的情况下就是“VENDOR snpslmd C:\Synopsys\SCL\<version>\win32\bin\snpslmd.exe”)。

weixin_47351160的博客 2045

戴尔PowerEdge服务器R450 RAID配置步骤

戴尔PowerEdge服务器R450 RAID配置步骤

且听风呤tmj的博客 6911

java代码例子_Java与C++两大语言比较

JavaJava是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点。Java可以编写桌面应用程...

weixin_39990819的博客 446

AI 小说生成器本地部署完全指南

这篇文章介绍了本地部署AI小说生成器的完整指南,主要面向网文作者、内容创作者和AI爱好者。文章从环境搭建到创作实践,详细讲解了三种主流部署方案:Ollama(推荐新手)、LMStudio(图形界面)和text-generation-webui(高级定制)。内容涵盖硬件需求、系统架构、模型选择、API对接、提示词工程等关键技术环节,并提供了小说创作的特制提示词模板和参数调优建议。文章还讨论了长篇小说管理、多模型协作等进阶技巧,以及版权伦理等法律问题。最后推荐了相关工具资源和社区论坛,帮助读者实现安全、高效、可

珂珂可爱多 2279
下一篇: 哎,比较浮躁
mentalmap
博客等级 码龄22年 0粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值