簡體   English   中英

將 JNI 與 Gradle(和 lombok)一起使用

[英]Using JNI with Gradle (and lombok)

我正在嘗試將我的 Java 應用程序連接到我編寫的 c++ 代碼。

我從網上教程中收集到的是:

  1. 使用帶有-h標志的javac為具有本機方法的類生成 c/c++ 頭文件
  2. 然后,您將生成的標頭導入您的 c/c++ 應用程序並實現它們
  3. 您將實現的應用程序構建為動態庫文件
  4. 您將構建的庫文件放在 java 庫路徑中(無論它在哪里)
  5. 然后添加一個 static System.loadLibrary調用,以加載構建的庫,因此現在您可以使用本機函數 - 由您的庫實現。

我遇到麻煩的第一步是第 1 步——我遇到了很多關於依賴項的編譯錯誤,所以我在網上搜索了一些關於如何將 JNI 與 gradle 一起使用——而不僅僅是純 java 編譯器,我發現了這個任務:

task generateJniHeaders(type: JavaCompile) {
    classpath = sourceSets.main.compileClasspath
    destinationDir file("${buildDir}/generated/jni")
    source = sourceSets.main.java
    options.compilerArgs += [
            '-h', file("${buildDir}/generated/jni"),
            '-d', file("${buildDir}/generated/jni-tmp")
    ]
    // options.verbose = true
    doLast {
        delete file("${buildDir}/generated/jni-tmp")
    }
}

這項任務似乎有效,但現在我遇到的問題是它無法通過 lombok 注釋進行編譯; 例如,我得到了一個由 lombok 生成的 getter function 的未找到符號。

我已經正確設置了 lombok - 我的正常 gradle 構建工作正常 - 但我認為 lombok 代碼生成沒有針對此任務完成。 是否有可能做到這一點?

為編譯配置注釋處理器,如下所示:

dependencies {
    annotationProcessor 'org.projectlombok:lombok'
    // ... 
}

task generateJniHeaders(type: JavaCompile) {
    classpath = sourceSets.main.compileClasspath
    destinationDir file("${buildDir}/generated/jni")
    source = sourceSets.main.java
    options.compilerArgs += [
            '-h', file("${buildDir}/generated/jni"),
            '-d', file("${buildDir}/generated/jni-tmp")
    ]
    
    options.annotationProcessorPath = configurations.annotationProcessor
    // ^^^^ use the configured annotation processor ^^^^
    
    doLast {
        delete file("${buildDir}/generated/jni-tmp")
    }
}

現在將處理 lombok 注釋,可以正確生成 header 文件

您可以嘗試通過添加編譯器 arg -processorpath path/to/lombok.jar

如果這個特定任務的目的只是生成 header 文件而不是別的,另一個選擇是首先讓 lombok delombok 將所有源代碼放入一個 tempdir,然后在其上運行 javac。 有點激烈,也許。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM