【问题标题】:Jlibfprint cross compilationJlibfprint 交叉编译
【发布时间】:2018-08-30 15:39:10
【问题描述】:

我正在尝试使用 buildroot 交叉编译 JNI Bridge Jlibfprint。

This是源代码。

这是 .mk 文件:

JLIBFPRINT_VERSION = 775295f08174d11d39da9e327120b128ef270fc4
JLIBFPRINT_SITE = $(call github,eduardobogoni,jlibfprint,$(JLIBFPRINT_VERSION))
JLIBFPRINT_AUTORECONF = YES

JLIBFPRINT_SUBDIR = JlibFprint_jni
#JLIBFPRINT_CONF_OPTS = --enable-debug-log --enable-udev-rules=no --disable-debug-log

JLIBFPRINT_INSTALL_STAGING = YES

define PREPARE_FILES_AND_FIX_DIRECTORY
    cd $(@D)/JlibFprint_jni && \
    libtoolize
endef

JLIBFPRINT_PRE_CONFIGURE_HOOKS += PREPARE_FILES_AND_FIX_DIRECTORY

$(eval $(autotools-package))

提取、修补、更新、配置、自动重新配置、修补 libtool 运行没有问题。

然后它在构建阶段失败了:

libfprint_jni_la-jlibfprint_JlibFprint.o
In file included from jlibfprint_Device.cpp:1:0:
jlibfprint_Device.h:5:10: fatal error: jni.h: No such file or directory
 #include <jni.h>
          ^~~~~~~
compilation terminated.

然后我添加,这些包括到 /JlibFprint_jni/src/Makefile.am

ADD_INCLUDES=-I/usr/lib/jvm/java-11-openjdk-amd64/include -I/usr/lib/jvm/java-11-openjdk-amd64/include/linux -I/home/mariano/buildroot/output/build/libfprint-0.7.0 -I/home/mariano/buildroot/output/build/libfprint-0.7.0/libfprint/nbis/include

现在它失败了:

arm-linux-gnueabihf-g++: ERROR: unsafe header/library path used in cross-compilation: '-I/usr/lib/jvm/java-11-openjdk-amd64/include'
arm-linux-gnueabihf-g++: ERROR: unsafe header/library path used in cross-compilation: '-I/usr/lib/jvm/java-11-openjdk-amd64/include'
libtool: compile:  /home/mariano/buildroot/output/host/bin/arm-linux-gnueabihf-g++ -DPACKAGE_NAME=\"libfprint_jni\" -DPACKAGE_TARNAME=\"libfprint_jni\" -DPACKAGE_VERSION=\"1.0\" "-DPACKAGE_STRING=\"libfprint_jni 1.0\"" -DPACKAGE_BUGREPORT=\"\" -DPACKAGE_URL=\"\" -DPACKAGE=\"libfprint_jni\" -DVERSION=\"1.0\" -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_STRING=1 -DHAVE_IOSTREAM=1 -DHAVE_LIBFPRINT_FPRINT_H=1 -DHAVE_DLFCN_H=1 -DLT_OBJDIR=\".libs/\" -I. -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -I/usr/lib/jvm/java-11-openjdk-amd64/include -I/usr/lib/jvm/java-11-openjdk-amd64/include/linux -I/home/mariano/buildroot/output/build/libfprint-0.7.0 -I/home/mariano/buildroot/output/build/libfprint-0.7.0/libfprint/nbis/include -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 -Os -c jlibfprint_JlibFprint.cpp  -fPIC -DPIC -o .libs/libfprint_jni_la-jlibfprint_JlibFprint.o
Makefile:496: recipe for target 'libfprint_jni_la-jlibfprint_Device.lo' failed

【问题讨论】:

  • 请出示您的 jlibfprint.mk 文件。

标签: java c++ linux cross-compiling buildroot


【解决方案1】:

Jlibfprint 需要 JDK,但 Buildroot 没有 JDK 包。因此,使用 Buildroot 构建 Jlibfprint 将永远无法工作。

【讨论】:

    【解决方案2】:

    我为 ARM 32 位下载了 JDK,并将包含的内容添加到该文件夹​​中。

    我删除了 BR2_COMPILER_PARANOID_UNSAFE_PATH=n,因为 Arnout 说这是错误的。它交叉编译没有问题。

    我运行了 Sample Run,它与 Upek 指纹扫描仪配合使用。

    【讨论】:

    • 这是非常错误的。警告是有原因的。使用 Buildroot,您正在构建一个不同于您正在构建的“主机”系统的“目标”系统。来自主机的包含文件(即 /usr/include/...)可能与目标上安装的库所期望的不同。
    • 你不认为我可以从 JDK 为 ARM 添加包含吗?我的目标没有安装 jdk。
    • 如果你的目标没有 JDK,那么 jlibfprint 怎么能在目标上工作呢?
    • 我的目标确实有一个 JDK,它只是 Buildroot,默认情况下没有,但可以从 Oracle 官方页面下载适用于 ARM 32 和 64 位的 JDK。我也不需要在我的目标上安装 JDK,但我在我的主机上确实需要它,我的猜测是 Jlibfprint 只需要 JDK 的一些文件来编译库。这正是我所做的。
    【解决方案3】:

    我现在正在处理这个问题。 buildroot包含openjdk,但不安装jni头文件,所以当使用staging作为sysroot进行交叉编译时,会出错。

    据我所知,jni 标头(jni.h 和 jni_md.h)仅用作类型转换,并且可以毫无问题地包含在目标中。我将它们添加到 sysroot 并编译没有问题。

    【讨论】:

      猜你喜欢
      • 2011-03-13
      • 2014-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多