gpt4 book ai didi

java - 加载所需库时出现 CANNOT LINK EXECUTABLE 错误。如何正确链接它们?

转载 作者:行者123 更新时间:2023-12-04 22:46:22 24 4
gpt4 key购买 nike

编辑:我知道可能存在重复,但答案并不直接适用。我正在使用 ProcessBuilder 而不是 Runtime.getRuntime().exec:

public int execProcess(List<String> cmds, ShellUtils.ShellCallback sc) {    
StringBuilder cmdlog = new StringBuilder();
for (String cmd : cmds) {
cmdlog.append(' ');
}
Utils.logger("v", cmdlog.toString(), DEBUG_TAG);

ProcessBuilder pb = new ProcessBuilder();
pb.directory(mBinFileDir);
pb.command(cmds);

Process process = null;
int exitVal = 1; // Default error
try {
process = pb.start();

StreamGobbler errorGobbler = new
StreamGobbler(process.getErrorStream(), "ERROR", sc);

StreamGobbler outputGobbler = new
StreamGobbler(process.getInputStream(), "OUTPUT", sc);

errorGobbler.start();
outputGobbler.start();

exitVal = process.waitFor();

sc.processComplete(exitVal);

} catch (Exception e) {
Log.e(DEBUG_TAG, "Error executing ffmpeg command!", e);
} finally {
if (process != null) {
Utils.logger("w", "destroyng process", DEBUG_TAG);
process.destroy();
}
}
return exitVal;
}

我在 FFmpeg 上有两个为 Android 编译的版本:有和没有 liblame已启用。

当我加载/data/data/<<my-package-name>>/app_bin/时FFmpeg 二进制文件编译时没有 lame 支持,它可以毫无问题地从视频中提取音频。但是当我使用启用了 lame 支持的版本时,我在日志中收到以下错误。

所需的库(也是为 Android 编译的)在运送到 libs 时已正确加载。项目文件夹 System.loadLibrary("lame") .

我想知道是否还有其他事情要做才能正确地使 FFmpeg 二进制文件找到库。这些与提供给 NDK 来构建 FFmpeg 二进制文件的库相同。

D/dalvikvm(13741): Trying to load lib /data/app-lib/<<my-package-name>>/liblame.so 0x40ffed08
D/dalvikvm(13741): Added shared lib /data/app-lib/<<my-package-name>>/liblame.so 0x40ffed08
D/dalvikvm(13741): No JNI_OnLoad found in /data/app-lib/<<my-package-name>>/liblame.so 0x40ffed08, skipping init
D/FfmpegController(13741): Trying to chmod '/data/data/<<my-package-name>>/app_bin/ffmpeg' to: 755
V/FfmpegController(13741): /data/data/<<my-package-name>>/app_bin/ffmpeg -y -i /storage/sdcard0/Download/video.webm -vn -acodec copy /storage/sdcard0/Download/audio.ogg
>>>>>> ---------- <<<<<<
D/DownloadsService(13741): soinfo_link_image(linker.cpp:1673): could not load library "liblame.so" needed by "/data/data/<<my-package-name>>/app_bin/ffmpeg"; caused by load_library(linker.cpp:771): library "liblame.so" not foundCANNOT LINK EXECUTABLE
>>>>>> ---------- <<<<<<
I/DownloadsService(13741): FFmpeg process exit value: 255

我没有附加代码,因为它相当简单:

  • 下载 FFmpeg 二进制文件(它不随应用程序一起提供);
  • 将二进制文件从下载文件夹复制到 /data/data/<<my-package-name>>/app_bin/ ;
  • chmod 755;
  • 从那里执行并读取输出。

如果还有什么需要请评论。

最佳答案

有趣的是,我最近找到了所有答案......无论如何,因为它对其他人可能有用,如果您愿意的话:

  • 添加共享库的路径,例如 liblame.so
  • 已加载 System.loadLibrary("lame")来自libs文件夹
  • 并且您想使用 ProcessBuilder

:

1)

ProcessBuilder pb = new ProcessBuilder("liblame.so");
Map<String, String> envMap = pb.environment();
envMap.put("LD_LIBRARY_PATH", "/data/app-lib/<<my-pkg-name>>/");

或者,更好的是,避免处理包名称(发生变化)后的“-1”或“-2”后缀:

2)

ProcessBuilder pb = new ProcessBuilder();
Map<String, String> envMap = pb.environment();
envMap.put("LD_LIBRARY_PATH", "/data/data/<<my-pkg-name>>/lib");

并且不要硬编码 /data/data/<<my-pkg-name>>/lib使用:Context.getApplicationInfo().nativeLibraryDir

通过这个解决方案2)我还发现System.loadLibrary("lame") 不需要需要。

关于java - 加载所需库时出现 CANNOT LINK EXECUTABLE 错误。如何正确链接它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15771389/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com