簡體   English   中英

從 kotlin 文件生成本機標頭

[英]Generate native headers from kotlin file

我正在嘗試編寫 JNI 應用程序並想在其中使用 kotlin。

據我了解 kotlin 相當於:

private static native void hi();

是:

private external fun hi()

但問題是我不能在我的項目中使用 gradle 生成 gen.h 文件:

compileJava{
    options.headerOutputDirectory.set(file('src/main/java/idk/bluecross/JMM/natives'))
}

我怎樣才能做到這一點?

順便說一句,這是我的 build.gradle:

plugins {
    id 'java'
    id 'org.jetbrains.kotlin.jvm' version '1.8.0-RC2'
    id 'application'
    id 'cpp'
}

group 'idk.bluecross'
version '1.0-SNAPSHOT'
application.mainClass = 'idk.bluecross.example.Main'

application {
    applicationDefaultJvmArgs +=
            ["-Djava.library.path=" + file("${buildDir}/libs/jMM/shared").absolutePath]
}

compileJava{
    options.headerOutputDirectory.set(file('src/main/java/idk/bluecross/JMM/natives'))
}

repositories {
    mavenCentral()
}

dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8"
}

model {
    platforms {
        x64 {
            architecture "x86_64"
        }
    }

    components {
        JMM(NativeLibrarySpec) {
            sources {
                cpp {
                    source {
                        srcDir "src/main/java/idk/bluecross/JMM/natives"
                    }
                }
            }
            targetPlatform "x64"
            binaries.all {
                def jvmHome = System.properties['java.home']
                if (targetPlatform.operatingSystem.macOsX) {
                    cppCompiler.args '-I', "${jvmHome}/include"
                    cppCompiler.args '-I', "${jvmHome}/include/darwin"
                    cppCompiler.args '-mmacosx-version-min=10.4'
                    linker.args '-mmacosx-version-min=10.4'
                } else if (targetPlatform.operatingSystem.linux) {
                    cppCompiler.args '-I', "${jvmHome}/include"
                    cppCompiler.args '-I', "${jvmHome}/include/linux"
                    cppCompiler.args '-D_FILE_OFFSET_BITS=64'
                } else if (targetPlatform.operatingSystem.windows) {
                    cppCompiler.args "-I${jvmHome}/include"
                    cppCompiler.args "-I${jvmHome}/include/win32"
                } else if (targetPlatform.operatingSystem.freeBSD) {
                    cppCompiler.args '-I', "${jvmHome}/include"
                    cppCompiler.args '-I', "${jvmHome}/include/freebsd"
                }
            }
        }
    }
}

classes.dependsOn 'JMMSharedLibrary'

方法 1 - Gradle 配置

找到build.gradle.kts

https://eritque-arcus.tech/2021/05/14/kotlin-%E7%94%9F%E6%88%90jni%E5%A4%B4%E6%96%87%E4%BB%B6/# %E8%A7%A3%E5%86%B3%E6%96%B9%E6%B3%95

方法二——手動方法(No Maven or Gradle Config, Only use IDEA)——骯臟的方式

創建一個 Java Class - Hello.java

package com.demo.lab;

public class Hello {
    static {
         System.loadLibrary("hello");
    }

    public native void SayHello(String strName);
}

生成.h

IntelliJ IDEA Settings -> Build,Execution,Deployment -> Compiler -> Java Compiler -> Java Options -> Additional command line parameters:

-h $PROJECT_DIR$/src

創建.h

Select Hello.java,菜單Build -> Recompile Hello.java

Select 項目,彈出菜單 -> Reload From Disk

現在你可以在src目錄下找到com_demo_lab_Hello.h

com_demo_lab_Hello.h

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_demo_lab_Hello */

    #ifndef _Included_com_demo_lab_Hello
    #define _Included_com_demo_lab_Hello
    #ifdef __cplusplus
    extern "C" {
    #endif
    /*
     * Class:     com_demo_lab_Hello
     * Method:    SayHello
     * Signature: (Ljava/lang/String;)V
     */
    JNIEXPORT void JNICALL Java_com_demo_lab_Hello_SayHello
      (JNIEnv *, jobject, jstring);
    
    #ifdef __cplusplus
    }
    #endif
    #endif

然后創建並編譯 C 或 C++ 庫

創建 Kotlin 文件 - Hello.kt 等效於 Hello.java

package com.demo.lab

class Hello {
    external fun SayHello(strName: String?)

    companion object {
        init {
            System.loadLibrary("hello")
        }
    }
}

暫無
暫無

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

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