我是第一次尝试NDK,而且我一直坚持建立这个项目。我正在尝试使用Android的screencap录制程序中使用的库来从我的屏幕上读取数据。我知道我需要使用LibGUI,这是我从手机中取出的。然而,每当我编译时,我都会将此作为错误消息:
C:/Users/Kevin/Desktop/ScreenCapture//jni/main.cpp:2:34: fatal error: gui/ISurfaceComposer.h: No such file or directory
考虑到我有libgui.so,这很奇怪。
我的主文件是什么样的:
#include <stdio.h>
#include <gui/ISurfaceComposer.h>
int main() {
printf("Started!");
return 0;
}
我的Android.mk是什么样的:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := libgui-prebuilt
LOCAL_SRC_FILES := libgui.so
include $(PREBUILT_SHARED_LIBRARY)
include $(CLEAR_VARS)
LOCAL_MODULE := screencapture
LOCAL_SRC_FILES := main.cpp
LOCAL_SHARED_LIBRARIES := libgui-prebuilt
include $(BUILD_EXECUTABLE)
我将主文件和libgui.so放在同一个文件夹中。
答案 0 :(得分:1)
main.cpp:2:34:致命错误:gui / ISurfaceComposer.h:没有这样的文件或目录
您的错误消息表明编译器无法找到标头文件,但您尝试的解决方案是提供共享对象(.so)库来自手机。
图书馆可能会在链接时提供帮助,但在您可以链接之前必须成功编译,为此您必须获取缺少的标题(可能来自AOSP来源,因为源代码不会在电话)或者通过从你收集的线索中推断出它的内容来重新创建它。不幸的是,通常不可能只从AOSP中取出一个内部标题,因为它可能取决于许多其他标题。
如果内部组件之间的私人界面在Android版本之间发生变化,则链接私有系统内部也会导致程序崩溃的风险。
(通常我还会提到你不太可能用NDK记录屏幕,正常使用共享库链接到应用程序进程,但你的Android.mk似乎表示您正在构建可执行文件 - 如果您可以成功构建可执行文件 并且您以具有足够权限的用户身份运行,例如adb&#39; {{1 } userid或使用root hack)
答案 1 :(得分:0)
为模块screencapture添加一行:
LOCAL_C_INCLUDES := $(LOCAL_PATH)/
如果您没有文件夹gui,则需要将包含标题* .h的文件粘贴并粘贴到文件夹jni / gui中。总是这样的要求就像使用ndk那样...
或第二种情况 - 使用此来源的其他位置为ldlibs:
LOCAL_LDLIBS := -L/full_path_to_source_gui/gui/