use std::path::PathBuf;
use boltffi_backend::target::kmp::KMP_SUPPORT_REPORT_FILE;
use crate::config::Config;
use crate::pack::android::AndroidPackageLayout;
use crate::pack::java::link::JvmNativePackageLayout;
#[derive(Debug, Clone, Eq, PartialEq)]
pub(crate) struct KmpPackageLayout {
output_root: PathBuf,
android_jni_dir: PathBuf,
android_jnilibs_dir: PathBuf,
jvm_jni_dir: PathBuf,
jvm_native_resource_root: PathBuf,
support_report_path: PathBuf,
}
impl KmpPackageLayout {
pub(crate) fn from_config(config: &Config) -> Self {
let output_root = config.kotlin_multiplatform_output();
Self {
android_jni_dir: output_root.join("src/androidMain/c"),
android_jnilibs_dir: output_root.join("src/androidMain/jniLibs"),
jvm_jni_dir: output_root.join("src/jvmMain/c"),
jvm_native_resource_root: output_root.join("src/jvmMain/resources/native"),
support_report_path: output_root.join(KMP_SUPPORT_REPORT_FILE),
output_root,
}
}
pub(crate) fn output_root(&self) -> &PathBuf {
&self.output_root
}
pub(crate) fn jvm_jni_dir(&self) -> &PathBuf {
&self.jvm_jni_dir
}
pub(crate) fn android_jni_dir(&self) -> &PathBuf {
&self.android_jni_dir
}
pub(crate) fn jvm_native_resource_root(&self) -> &PathBuf {
&self.jvm_native_resource_root
}
pub(crate) fn support_report_path(&self) -> &PathBuf {
&self.support_report_path
}
pub(crate) fn android_native_layout(&self, header_name: &str) -> AndroidPackageLayout {
AndroidPackageLayout {
jni_glue_path: self.android_jni_dir.join("jni_glue.c"),
header_include_dir: self.android_jni_dir.clone(),
header_name: header_name.to_string(),
jnilibs_path: self.android_jnilibs_dir.clone(),
}
}
pub(crate) fn jvm_native_layout(
&self,
config: &Config,
header_name: &str,
) -> JvmNativePackageLayout {
JvmNativePackageLayout::kotlin_desktop(
config,
self.jvm_jni_dir.clone(),
header_name,
self.jvm_native_resource_root.clone(),
)
}
}