[英]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'
找到build.gradle.kts
package com.demo.lab;
public class Hello {
static {
System.loadLibrary("hello");
}
public native void SayHello(String strName);
}
IntelliJ IDEA Settings
-> Build,Execution,Deployment
-> Compiler
-> Java Compiler
-> Java Options
-> Additional command line parameters:
-h $PROJECT_DIR$/src
Select Hello.java,菜單Build
-> Recompile Hello.java
Select 項目,彈出菜單 -> Reload From Disk
現在你可以在src
目錄下找到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++ 庫
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.