鸿蒙Next NDK如何导出常量
在鸿蒙Next开发中,使用NDK时如何正确导出C/C++中定义的常量到Java/Kotlin层?具体需要哪些配置或注解?能否提供一个简单的示例代码说明常量的跨语言调用流程?
2 回复
鸿蒙Next NDK导出常量?简单!在C++里用extern "C"声明,再在Java/Kotlin里用native方法调用就行。记得加__attribute__((visibility("default")))防止被优化掉。就像在冰箱门上贴便签——得让系统看得见!
更多关于鸿蒙Next NDK如何导出常量的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在鸿蒙Next NDK中,导出常量到C/C++层可以通过以下方式实现:
1. 在ArkTS/TS中定义常量
// constants.ts
export const MY_CONSTANT: number = 100;
export const APP_NAME: string = "MyApp";
2. 创建Native接口
// native_module.cpp
#include "napi/native_api.h"
static napi_value GetConstant(napi_env env, napi_callback_info info) {
napi_value result;
napi_create_int32(env, 100, &result); // 对应MY_CONSTANT
return result;
}
static napi_value GetAppName(napi_env env, napi_callback_info info) {
napi_value result;
napi_create_string_utf8(env, "MyApp", NAPI_AUTO_LENGTH, &result);
return result;
}
EXTERN_C_START
static napi_value Init(napi_env env, napi_value exports) {
napi_property_descriptor desc[] = {
{"MY_CONSTANT", nullptr, GetConstant, nullptr, nullptr, nullptr, napi_default, nullptr},
{"APP_NAME", nullptr, GetAppName, nullptr, nullptr, nullptr, napi_default, nullptr}
};
napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
return exports;
}
EXTERN_C_END
static napi_module native_module = {
.nm_version = 1,
.nm_flags = 0,
.nm_filename = nullptr,
.nm_register_func = Init,
.nm_modname = "constants",
.nm_priv = nullptr,
};
extern "C" __attribute__((constructor)) void RegisterConstantsModule() {
napi_module_register(&native_module);
}
3. 在ArkTS中调用
import { MY_CONSTANT, APP_NAME } from './constants';
// 使用常量
console.log(`Constant value: ${MY_CONSTANT}`);
console.log(`App name: ${APP_NAME}`);
关键点说明:
- 使用NAPI机制创建原生模块
- 通过napi_create_*系列函数创建不同类型的常量值
- 需要在模块注册时定义属性描述符
- 使用
__attribute__((constructor))确保模块自动注册
注意事项:
- 常量值在Native层是硬编码的,修改需要重新编译so
- 字符串常量注意使用正确的编码格式
- 确保模块名称在应用中唯一
这种方式适用于需要跨ArkTS和Native层共享的常量定义。

