javacpp调用pdfium的c++动态库

1、.h头文件

2、生成java代码的conf    

PdfiumDocumentConfigure.java
package org.swdc.pdfium.conf;

import org.bytedeco.javacpp.annotation.Platform;
import org.bytedeco.javacpp.annotation.Properties;
import org.bytedeco.javacpp.tools.InfoMap;
import org.bytedeco.javacpp.tools.InfoMapper;

@Properties(value = {
        @Platform(
                value = "windows-x86_64",
                include = "fpdf_doc.h",
                link = "pdfium"
        ),
        @Platform(
                value = "macosx-x86_64",
                include = "fpdf_doc.h",
                link = "pdfium"
        )
},
        inherit = PdfiumViewConfigure.class,
        target = "org.swdc.pdfium.core.PdfiumDocument",
        global = "org.swdc.pdfium.core.PdfiumDocument"
)
public class PdfiumDocumentConfigure implements InfoMapper {
    @Override
    public void map(InfoMap infoMap) {

    }
}
PdfiumEditConfigure.java
package org.swdc.pdfium.conf;

import org.bytedeco.javacpp.annotation.Platform;
import org.bytedeco.javacpp.annotation.Properties;
import org.bytedeco.javacpp.tools.Info;
import org.bytedeco.javacpp.tools.InfoMap;
import org.bytedeco.javacpp.tools.InfoMapper;

@Properties(value = {
        @Platform(
                value = "windows-x86_64",
                include = {
                        "fpdf_edit.h",
                        "fpdf_save.h",
                        "ext_fpdf_save.h",
                        "ext_fpdf_edit.h"
                },
                link = "pdfium"
        ),
        @Platform(
                value = "macosx-x86_64",
                include = {
                        "fpdf_edit.h",
                        "fpdf_save.h",
                        "ext_fpdf_save.h",
                        "ext_fpdf_edit.h"
                },
                link = "pdfium"
        )
},
        inherit = PdfiumViewConfigure.class,
        target = "org.swdc.pdfium.core.edit",
        global = "org.swdc.pdfium.core.PdfiumEdit"
)
public class PdfiumEditConfigure implements InfoMapper {
    @Override
    public void map(InfoMap infoMap) {

        infoMap.put(new Info("FPDF_FILEWRITE_").cppTypes("FPDF_FILEWRITE").translate());
        // do not add ext private methods.
        infoMap.put(new Info(
                "priv_fpdf_write_data",
                "priv_fpdf_readJpegBytes",
                "FWriter_",
                "PDFWriter"
        ).skip());

    }
}

PdfiumTextConfigure.java
package org.swdc.pdfium.conf;

import org.bytedeco.javacpp.annotation.Platform;
import org.bytedeco.javacpp.annotation.Properties;
import org.bytedeco.javacpp.tools.InfoMap;
import org.bytedeco.javacpp.tools.InfoMapper;

@Properties(value = {
        @Platform(
                value = "windows-x86_64",
                include = "fpdf_text.h",
                link = "pdfium"
        ),
        @Platform(
                value = "macosx-x86_64",
                include = "fpdf_text.h",
                link = "pdfium"
        )
},
        inherit = PdfiumViewConfigure.class,
        target = "org.swdc.pdfium.core.PdfiumText",
        global = "org.swdc.pdfium.core.PdfiumText"
)
public class PdfiumTextConfigure implements InfoMapper {
        @Override
        public void map(InfoMap infoMap) {

        }
}
PdfiumViewConfigure.java
package org.swdc.pdfium.conf;

import org.bytedeco.javacpp.annotation.Platform;
import org.bytedeco.javacpp.annotation.Properties;
import org.bytedeco.javacpp.tools.Info;
import org.bytedeco.javacpp.tools.InfoMap;
import org.bytedeco.javacpp.tools.InfoMapper;

@Properties(value = {
        @Platform(
                value = "windows-x86_64",
                include = "fpdfview.h",
                link = "pdfium",
                preload = "pdfium"
        ),
        @Platform(
                value = "macosx-x86_64",
                include = "fpdfview.h",
                link = "pdfium",
                preload = "pdfium"
        )
},
        target = "org.swdc.pdfium.core.view",
        global = "org.swdc.pdfium.core.PdfiumView"
)
public class PdfiumViewConfigure implements InfoMapper {
        @Override
        public void map(InfoMap infoMap) {

                translateType(infoMap,"fpdf_annotation_t__","FPDF_ANNOTATION");
                translateType(infoMap,"fpdf_attachment_t__","FPDF_ATTACHMENT");
                translateType(infoMap,"fpdf_avail_t__","FPDF_AVAIL");
                translateType(infoMap,"fpdf_bitmap_t__","FPDF_BITMAP");
                translateType(infoMap,"fpdf_bookmark_t__","FPDF_BOOKMARK");
                translateType(infoMap,"fpdf_clippath_t__","FPDF_CLIPPATH");
                translateType(infoMap,"fpdf_dest_t__","FPDF_DEST");
                translateType(infoMap,"fpdf_document_t__","FPDF_DOCUMENT");
                translateType(infoMap,"fpdf_font_t__","FPDF_FONT");
                translateType(infoMap,"fpdf_form_handle_t__","FPDF_FORMHANDLE");
                translateType(infoMap,"fpdf_javascript_action_t","FPDF_JAVASCRIPT_ACTION");
                translateType(infoMap,"fpdf_link_t__","FPDF_LINK");
                translateType(infoMap,"fpdf_page_t__","FPDF_PAGE");
                translateType(infoMap,"fpdf_pagelink_t__","FPDF_PAGELINK");
                translateType(infoMap,"fpdf_pageobject_t__","FPDF_PAGEOBJECT");
                translateType(infoMap,"fpdf_pageobjectmark_t__","FPDF_PAGEOBJECTMARK");
                translateType(infoMap,"fpdf_schhandle_t__","FPDF_SCHHANDLE");
                translateType(infoMap,"fpdf_structelement_t__","FPDF_STRUCTELEMENT");
                translateType(infoMap,"fpdf_structtree_t__","FPDF_STRUCTTREE");
                translateType(infoMap,"fpdf_textpage_t__","FPDF_TEXTPAGE");
                translateType(infoMap,"fpdf_widget_t__","FPDF_WIDGET");
                translateType(infoMap,"fpdf_xobject_t__","FPDF_XOBJECT");

                translateType(infoMap,"fpdf_action_t__","FPDF_ACTION");

                translateConstType(infoMap,"fpdf_pagerange_t__","FPDF_PAGERANGE");
                translateConstType(infoMap,"fpdf_pathsegment_t","FPDF_PATHSEGMENT");
                translateConstType(infoMap,"fpdf_signature_t__","FPDF_SIGNATURE");
                translateConstType(infoMap,"fpdf_structelement_attr_t__","FPDF_STRUCTELEMENT_ATTR");
                translateConstType(infoMap,"fpdf_glyphpath_t__","FPDF_GLYPHPATH");

                infoMap.put(new Info("FPDF_STRING").cppTypes("const char*").translate());
                infoMap.put(new Info("FPDF_WCHAR").cppTypes("unsigned short").translate());
                infoMap.put(new Info("FPDF_BYTESTRING").cppTypes("const char*").translate());
                infoMap.put(new Info("FPDF_WIDESTRING").cppTypes("unsigned short*").translate());
                infoMap.put(new Info("FPDF_EXPORT").cppText("#define FPDF_EXPORT\n"));
                infoMap.put(new Info("FPDF_CALLCONV").cppText("#define FPDF_CALLCONV\n"));

                infoMap.put(new Info(
                        "HDC",
                        "FPDF_BStr_Clear",
                        "FPDF_BStr_Set",
                        "FPDF_BStr_Init",
                        "FPDF_GetRecommendedV8Flags",
                        "FPDF_RenderPageSkia",
                        "FPDF_SetPrintMode",
                        "FPDF_GetArrayBufferAllocatorSharedInstance"
                ).skip());

        }


        private void translateType(InfoMap map, String oldName, String newName) {
                map.put(new Info(newName).cppTypes(oldName + "*").translate());
        }

        private void translateConstType(InfoMap map, String oldName, String newName) {
                map.put(new Info(newName).cppTypes("const struct " + oldName + " *").translate());
        }

}

 2、工程根pom

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.swdc</groupId>
    <artifactId>javacpp-presets</artifactId>
    <version>1.0</version>
    <packaging>pom</packaging>

    <modules>
        <module>live2d</module>
        <module>pdfium</module>
        <module>pdfium4j</module>
        <module>mariadb</module>
        <module>dearimgui</module>
        <module>videoai</module>

    </modules>

    <properties>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <!--        <javacpp.platform>${os.name}-${os.arch}</javacpp.platform>-->
        <osname>windows</osname>
        <osarch>x86_64</osarch>
        <javacpp.platform>windows-x86_64</javacpp.platform>
    </properties>

</project>

4、执行mvn clean 和 mvn package 详见

javacpp调用c++动态库-CSDN博客

5、第一次执行  mvn clean 和 mvn package  时  pdfium的pom文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.swdc</groupId>
        <artifactId>javacpp-presets</artifactId>
        <version>1.0</version>
    </parent>

    <artifactId>pdfium</artifactId>
    <version>1.0</version>

    <properties>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <javacpp.version>1.5.10</javacpp.version>
        <build.skip>false</build.skip>
    </properties>

    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.bytedeco/javacpp -->
        <dependency>
            <groupId>org.bytedeco</groupId>
            <artifactId>javacpp</artifactId>
            <version>${javacpp.version}</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.bytedeco/javacpp -->
        <dependency>
            <groupId>org.bytedeco</groupId>
            <artifactId>javacpp-platform</artifactId>
            <version>${javacpp.version}</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.bytedeco</groupId>
                <artifactId>javacpp</artifactId>
                <version>${javacpp.version}</version>

                <configuration>
                    <encoding>ISO-8859-1</encoding>
                    <includePaths>
                        <!--                        对应 Platform注解中的 includePath-->
                        <!--                        ${basedir} 为当前pom文件所在的项目目录 此处是videoai-->
                        <!--                        .h头文件所在目录-->
                        <includePath>${basedir}/../platforms/Pdfium/include/</includePath>
                        <includePath>${basedir}/../platforms/Pdfium/ext/</includePath>
                    </includePaths>
                    <linkPaths>
                        <linkPath>${basedir}/src/main/resources/org/swdc/pdfium/core/${osname}-${osarch}/</linkPath>
                    </linkPaths>

                </configuration>
                <executions>
                    <execution>
                        <id>javacpp.parser</id>
                        <phase>generate-sources</phase>
                        <goals>
                            <goal>build</goal>
                        </goals>
                        <configuration>
                            <skip>true</skip>
                            <!--输出目录生成jnidll的目录  三次 mvn clean mvn package skip都是true-->
                            <outputDirectory>${basedir}/src/main/resources/org/swdc/pdfium/core/${osname}-${osarch}/
                            </outputDirectory>
                            <classOrPackageName>org.swdc.pdfium.**</classOrPackageName>
                            <deleteJniFiles>true</deleteJniFiles>
                        </configuration>
                    </execution>
                    <execution>
                        <id>javacpp.compiler</id>
                        <phase>process-classes</phase>
                        <goals>
                            <goal>build</goal>
                        </goals>
                        <configuration>
                            <skip>false</skip>
                            <!--  第一二次mvn clean mvn package skip都是false 第三次是true-->
                            <!--     第一次mvn clean mvn package生成java代码的目录   -->
                            <outputDirectory>${basedir}/src/main/java/
                            </outputDirectory>
                            <!--     第二次mvn clean mvn package生成jnidll的目录   -->
<!--                            <outputDirectory>${basedir}/src/main/resources/org/swdc/pdfium/core/${osname}-${osarch}/-->
<!--                            </outputDirectory>-->
                            <deleteJniFiles>true</deleteJniFiles>
                            <classOrPackageName>org.swdc.pdfium.**</classOrPackageName>
                            <copyLibs>false</copyLibs>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

6、第二次执行  mvn clean 和 mvn package  时  pdfium的pom文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.swdc</groupId>
        <artifactId>javacpp-presets</artifactId>
        <version>1.0</version>
    </parent>

    <artifactId>pdfium</artifactId>
    <version>1.0</version>

    <properties>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <javacpp.version>1.5.10</javacpp.version>
        <build.skip>false</build.skip>
    </properties>

    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.bytedeco/javacpp -->
        <dependency>
            <groupId>org.bytedeco</groupId>
            <artifactId>javacpp</artifactId>
            <version>${javacpp.version}</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.bytedeco/javacpp -->
        <dependency>
            <groupId>org.bytedeco</groupId>
            <artifactId>javacpp-platform</artifactId>
            <version>${javacpp.version}</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.bytedeco</groupId>
                <artifactId>javacpp</artifactId>
                <version>${javacpp.version}</version>

                <configuration>
                    <encoding>ISO-8859-1</encoding>
                    <includePaths>
                        <!--                        对应 Platform注解中的 includePath-->
                        <!--                        ${basedir} 为当前pom文件所在的项目目录 此处是videoai-->
                        <!--                        .h头文件所在目录-->
                        <includePath>${basedir}/../platforms/Pdfium/include/</includePath>
                        <includePath>${basedir}/../platforms/Pdfium/ext/</includePath>
                    </includePaths>
                    <linkPaths>
                        <linkPath>${basedir}/src/main/resources/org/swdc/pdfium/core/${osname}-${osarch}/</linkPath>
                    </linkPaths>

                </configuration>
                <executions>
                    <execution>
                        <id>javacpp.parser</id>
                        <phase>generate-sources</phase>
                        <goals>
                            <goal>build</goal>
                        </goals>
                        <configuration>
                            <skip>true</skip>
                            <!--输出目录生成jnidll的目录  三次 mvn clean mvn package skip都是true-->
                            <outputDirectory>${basedir}/src/main/resources/org/swdc/pdfium/core/${osname}-${osarch}/
                            </outputDirectory>
                            <classOrPackageName>org.swdc.pdfium.**</classOrPackageName>
                            <deleteJniFiles>true</deleteJniFiles>
                        </configuration>
                    </execution>
                    <execution>
                        <id>javacpp.compiler</id>
                        <phase>process-classes</phase>
                        <goals>
                            <goal>build</goal>
                        </goals>
                        <configuration>
                            <skip>false</skip>
                            <!--  第一二次mvn clean mvn package skip都是false 第三次是true-->
                            <!--     第一次mvn clean mvn package生成java代码的目录   -->
<!--                            <outputDirectory>${basedir}/src/main/java/-->
<!--                            </outputDirectory>-->
                            <!--     第二次mvn clean mvn package生成jnidll的目录   -->
                            <outputDirectory>${basedir}/src/main/resources/org/swdc/pdfium/core/${osname}-${osarch}/
                            </outputDirectory>
                            <deleteJniFiles>true</deleteJniFiles>
                            <classOrPackageName>org.swdc.pdfium.**</classOrPackageName>
                            <copyLibs>false</copyLibs>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

7、第三次执行 mvn clean 和 mvn package  时  pdfium的pom文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.swdc</groupId>
        <artifactId>javacpp-presets</artifactId>
        <version>1.0</version>
    </parent>

    <artifactId>pdfium</artifactId>
    <version>1.0</version>

    <properties>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <javacpp.version>1.5.10</javacpp.version>
        <build.skip>false</build.skip>
    </properties>

    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.bytedeco/javacpp -->
        <dependency>
            <groupId>org.bytedeco</groupId>
            <artifactId>javacpp</artifactId>
            <version>${javacpp.version}</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.bytedeco/javacpp -->
        <dependency>
            <groupId>org.bytedeco</groupId>
            <artifactId>javacpp-platform</artifactId>
            <version>${javacpp.version}</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.bytedeco</groupId>
                <artifactId>javacpp</artifactId>
                <version>${javacpp.version}</version>

                <configuration>
                    <encoding>ISO-8859-1</encoding>
                    <includePaths>
                        <!--                        对应 Platform注解中的 includePath-->
                        <!--                        ${basedir} 为当前pom文件所在的项目目录 此处是videoai-->
                        <!--                        .h头文件所在目录-->
                        <includePath>${basedir}/../platforms/Pdfium/include/</includePath>
                        <includePath>${basedir}/../platforms/Pdfium/ext/</includePath>
                    </includePaths>
                    <linkPaths>
                        <linkPath>${basedir}/src/main/resources/org/swdc/pdfium/core/${osname}-${osarch}/</linkPath>
                    </linkPaths>

                </configuration>
                <executions>
                    <execution>
                        <id>javacpp.parser</id>
                        <phase>generate-sources</phase>
                        <goals>
                            <goal>build</goal>
                        </goals>
                        <configuration>
                            <skip>true</skip>
                            <!--输出目录生成jnidll的目录  三次 mvn clean mvn package skip都是true-->
                            <outputDirectory>${basedir}/src/main/resources/org/swdc/pdfium/core/${osname}-${osarch}/
                            </outputDirectory>
                            <classOrPackageName>org.swdc.pdfium.**</classOrPackageName>
                            <deleteJniFiles>true</deleteJniFiles>
                        </configuration>
                    </execution>
                    <execution>
                        <id>javacpp.compiler</id>
                        <phase>process-classes</phase>
                        <goals>
                            <goal>build</goal>
                        </goals>
                        <configuration>
                            <skip>true</skip>
                            <!--  第一二次mvn clean mvn package skip都是false 第三次是true-->
                            <!--     第一次mvn clean mvn package生成java代码的目录   -->
<!--                            <outputDirectory>${basedir}/src/main/java/-->
<!--                            </outputDirectory>-->
                            <!--     第二次mvn clean mvn package生成jnidll的目录   -->
                            <outputDirectory>${basedir}/src/main/resources/org/swdc/pdfium/core/${osname}-${osarch}/
                            </outputDirectory>
                            <deleteJniFiles>true</deleteJniFiles>
                            <classOrPackageName>org.swdc.pdfium.**</classOrPackageName>
                            <copyLibs>false</copyLibs>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

8、此时生成的pdfium-1.0.jar 便可以实现javacpp调用

9、详细代码连接如下

通过百度网盘分享的文件:javacpp-demo.zip
链接:https://pan.baidu.com/s/1ZDvctWkGG1rL1683xS8Srw?pwd=2e5y 
提取码:2e5y

10、总结如下 

第一步 mvn clean  mvn package 是生成java 代码

第二步 mvn clean  mvn package 是生成jni动态库

第三步 mvn clean  mvn package 是生成可以使用的jar

猜你喜欢

转载自blog.csdn.net/zsj777/article/details/142790688