JNI 无法在 NetBeans 上检测到 __int64

Posted

技术标签:

【中文标题】JNI 无法在 NetBeans 上检测到 __int64【英文标题】:JNI cannot detect __int64 on NetBeans 【发布时间】:2016-04-25 17:02:00 【问题描述】:

我正在尝试编译一个本地库以从 java 中使用它(使用 JNI)。我已按照本教程进行操作: https://cnd.netbeans.org/docs/jni/beginning-jni-win.html

错误

当我尝试编译时,我有这个错误(见第 4 行):

[...]
In file included from ../../Progra~2/Java/jdk1.8.0_91/include/jni.h:45:0,
                 from HelloWorldNative.h:3,
                 from HelloWorldNative.c:6:
../../Progra~2/Java/jdk1.8.0_91/include/win32/jni_md.h:34:9: error: unknown type name '__int64'
 typedef __int64 jlong;
         ^
nbproject/Makefile-Debug.mk:66: recipe for target 'build/Debug/Cygwin-Windows/HelloWorldNative.o' failed
[...]

我可以在#include <jni.h> 之前添加typedef long long __int64 来解决此错误,但我认为我做错了什么。

代码

代码如下:

头文件:

/* DO NOT EDIT THIS FILE - it is machine generated */
typedef long long __int64; // <============ Why do I need to do this?
#include <jni.h>
/* Header for class helloworld_Main */

#ifndef _Included_helloworld_Main
#define _Included_helloworld_Main
#ifdef __cplusplus
extern "C" 
#endif
/*
 * Class:     helloworld_Main
 * Method:    nativePrint
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_helloworld_Main_nativePrint
  (JNIEnv *, jobject);

#ifdef __cplusplus

#endif
#endif

源文件:

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
#include "HelloWorldNative.h"

JNIEXPORT void JNICALL Java_helloworld_Main_nativePrint
  (JNIEnv *env, jobject _this)


【问题讨论】:

【参考方案1】:

__int64 是 Visual Studio specific type

使用int64_t or uint64_t 等标准类型。在 &lt;cstdint&gt; 中定义 C++,在 &lt;stdint.h&gt; 中定义 C。


您的错误的确切解决方案可以在 JNI 常见问题中找到:

http://www.oracle.com/technetwork/java/jni-j2sdk-faq-141732.html

Your compiler might not like __int64 in jni_md.h. You should fix this by adding:
    #ifdef FOOBAR_COMPILER
    #define __int64 signed_64_bit_type
    #endif
where signed_64_bit_type is the name of the signed 64 bit type supported by your compiler.

所以你应该使用:

#define __int64 long long

或:

#include <stdint.h>
#define __int64 int64_t

这与您最初所做的非常相似

【讨论】:

我曾尝试在#include &lt;jni.h&gt; 之前添加#include &lt;stdint.h&gt;,但它不起作用。 @Dan 看到我的编辑,实际上你最初所做的将是可以接受的解决方案 - 至少 oracle 建议这样做。【参考方案2】:

首先在构建工具中检查您的 c 编译器。更改它为我修复了错误。

【讨论】:

以上是关于JNI 无法在 NetBeans 上检测到 __int64的主要内容,如果未能解决你的问题,请参考以下文章

Android JNI 打印 int64_t 到文件

Android - JNI // NDK无法找到SIGSEV

在YUV_420_888中将图像从Android发送到OpenCV Mat中的JNI的最有效方式

JNI_3

NetBeans 不会检测到 java ME 平台

请教,jni调用,类型转换.用opencv进行静态人脸检测