java - 在android中使用cpp和java时任务':app:externalNativeBuildDebug'执行失败
问题描述
使用 jni 将 c++ 链接到 java 时,我的 android studio 项目无法构建并出现此错误
Build command failed.
Error while executing process C:\Users\conno\AppData\Local\Android\Sdk\cmake\3.10.2.4988404\bin\ninja.exe with arguments {-C D:\Connor\DMA\Pipes\Android\Smart_Pipes\app\.cxx\cmake\debug\arm64-v8a native-lib}
ninja: Entering directory `D:\Connor\DMA\Pipes\Android\Smart_Pipes\app\.cxx\cmake\debug\arm64-v8a'
[1/1] Linking CXX shared library D:\Connor\DMA\Pipes\Android\Smart_Pipes\app\build\intermediates\cmake\debug\obj\arm64-v8a\libnative-lib.so
FAILED: D:/Connor/DMA/Pipes/Android/Smart_Pipes/app/build/intermediates/cmake/debug/obj/arm64-v8a/libnative-lib.so
cmd.exe /C "cd . && C:\Users\conno\AppData\Local\Android\Sdk\ndk\21.4.7075529\toolchains\llvm\prebuilt\windows-x86_64\bin\clang++.exe --target=aarch64-none-linux-android21 --gcc-toolchain=C:/Users/conno/AppData/Local/Android/Sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/windows-x86_64 --sysroot=C:/Users/conno/AppData/Local/Android/Sdk/ndk/21.4.7075529/toolchains/llvm/prebuilt/windows-x86_64/sysroot -fPIC -g -DANDROID -fdata-sections -ffunction-sections -funwind-tables -fstack-protector-strong -no-canonical-prefixes -D_FORTIFY_SOURCE=2 -Wformat -Werror=format-security -O0 -fno-limit-debug-info -Wl,--exclude-libs,libgcc.a -Wl,--exclude-libs,libgcc_real.a -Wl,--exclude-libs,libatomic.a -static-libstdc++ -Wl,--build-id -Wl,--fatal-warnings -Wl,--no-undefined -Qunused-arguments -shared -Wl,-soname,libnative-lib.so -o D:\Connor\DMA\Pipes\Android\Smart_Pipes\app\build\intermediates\cmake\debug\obj\arm64-v8a\libnative-lib.so CMakeFiles/native-lib.dir/oboe/samples/debug-utils/trace.cpp.o CMakeFiles/native-lib.dir/jni_bridge.cpp.o CMakeFiles/native-lib.dir/AudioEngine.cpp.o CMakeFiles/native-lib.dir/LatencyTuningCallback.cpp.o CMakeFiles/native-lib.dir/SoundGenerator.cpp.o -llog oboe/liboboe.a -llog -lOpenSLES -latomic -lm && cd ."
CMakeFiles/native-lib.dir/jni_bridge.cpp.o: In function `Java_com_android_smartpipes_PlaybackEngine_native_1setNote':
D:/Connor/DMA/Pipes/Android/Smart_Pipes/app/src/main/cpp/jni_bridge.cpp:189: undefined reference to `SoundGenerator::_Frequency'
D:/Connor/DMA/Pipes/Android/Smart_Pipes/app/src/main/cpp/jni_bridge.cpp:189: undefined reference to `SoundGenerator::_Frequency'
CMakeFiles/native-lib.dir/SoundGenerator.cpp.o: In function `SoundGenerator::tap(bool)':
D:/Connor/DMA/Pipes/Android/Smart_Pipes/app/src/main/cpp/SoundGenerator.cpp:(.text._ZN14SoundGenerator3tapEb+0x58): undefined reference to `SoundGenerator::_Frequency'
D:/Connor/DMA/Pipes/Android/Smart_Pipes/app/src/main/cpp/SoundGenerator.cpp:(.text._ZN14SoundGenerator3tapEb+0x5c): undefined reference to `SoundGenerator::_Frequency'
clang++: error: linker command failed with exit code 1 (use -v to see invocation)
ninja: build stopped: subcommand failed.
jni_bridge.cpp 中的方法
JNIEXPORT void JNICALL
Java_com_android_smartpipes_PlaybackEngine_native_1setNote(JNIEnv *env, jclass clazz, int note) {
double freqScale[] = {419.98, //LG
480.00, //LA
540.03, //B
599.88, //C
644.42, //D
720.02, //E
802.60, //F
839.96, //HG
960.00 //HA
};
SoundGenerator::_Frequency = freqScale[note];
}
我的 java 代码 PlaybackEngine.java
static void setNote(ENote note){
switch (note){
case ELG:
native_setNote(0);
case ELA:
native_setNote(1);
case EB:
native_setNote(2);
case EC:
native_setNote(3);
case ED:
native_setNote(4);
case EE:
native_setNote(5);
case EF:
native_setNote(6);
case EHG:
native_setNote(7);
case EHA:
native_setNote(8);
default:
native_setNote(8);
}
}
private static native void native_setNote(int note);
声音发生器.cpp
void SoundGenerator::tap(bool isOn) {
for (int i = 0; i < mChannelCount; ++i) {
mOscillators[i].setFrequency(SoundGenerator::_Frequency);
mOscillators[i].setWaveOn(isOn);
}
}
声音发生器.h
class SoundGenerator{
static double _Frequency;
}
我试图将java枚举注释作为int传递给cpp,然后将其转换为c++的double。
谢谢你的帮助
解决方案
您可能需要在 .cpp 文件中为静态类成员 SoundGenerator::_Frequency 单独定义实际变量,如下所示。
声音发生器.cpp
double SoundGenerator::_Frequency = 440.0; // A
推荐阅读
- tmux - 你可以使用转义序列来改变 tmux 状态栏的颜色吗?
- javascript - Vue中如何设置父组件的样式
- sql-server - 如果 IN 运算符的子查询失败会怎样?
- python - 如何导出数据,例如从 Chrome 扩展的 console.log() 到 Python 脚本
- firebase - 如何在 Firestore 文档中自动生成一个值?
- c++ - 纹理视图,GL_DEPTH_STENCIL_TEXTURE_MODE 参数设置为 GL_STENCIL_INDEX 和 Intel GPU
- javascript - 在开发者控制台中实例化类
- c# - 在 C# 中使用丢弃运算符“_”是否会以任何方式优化代码?
- json - Excel VBA REST API 连接 POST json 语法错误
- java - 如何在 restTemplate.exchange 期间从字符串返回特定对象?