无法使用 Cygwin 从 Java 运行 C 程序

2023-12-26

我正在尝试使用 JNI 编写我的第一个 Java/C 程序。这是“我的”代码的样子 - 它是从this http://stuf.ro/calling-c-code-from-java-using-jni网站:

/* HelloWorld.java */

public class HelloWorld {
    native void helloFromC();
    static {
        System.loadLibrary("ctest");
    }
    static public void main(String argv[]) {
        HelloWorld helloWorld = new HelloWorld();
        helloWorld.helloFromC();
    }
}

C part:

/* ctest.c */

#include <jni.h>
#include <stdio.h>

JNIEXPORT void JNICALL Java_HelloWorld_helloFromC
  (JNIEnv * env, jobject jobj)
{
    printf("Hello from C!\n");
}

通过Cygwin,我成功地做到了

javac HelloWorld.java
javah HelloWorld

创建一个像这样的头文件:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class HelloWorld */

#ifndef _Included_HelloWorld
#define _Included_HelloWorld
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     HelloWorld
 * Method:    helloFromC
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_HelloWorld_helloFromC
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

到目前为止,一切都很好。我还可以使用以下方法编译 C 程序:

$ gcc -D __int64="long long" -shared -I"D:\Programy\Java\JDK 8u31\include" 
-I"D:\Programy\Java\JDK 8u31\include\win32" ctest.c -o ctest.dll

现在我应该能够做到

java HelloWorld 

查看 C 的输出,但我收到此错误:

$ java HelloWorld
#
# A fatal error has been detected by the Java Runtime Environment:
#
#  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x000000018011ae47, pid=3156, tid=1176
#
# JRE version: Java(TM) SE Runtime Environment (8.0_31-b13) (build 1.8.0_31-b13)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.31-b07 mixed mode windows-amd64 compressed oops)
# Problematic frame:
# C  [cygwin1.dll+0xdae47]
#
# Failed to write core dump. Minidumps are not enabled by default on client versions of Windows
#
# An error report file with more information is saved as:
# D:\Dokumenty\Fifth\src\hs_err_pid3156.log
#
# If you would like to submit a bug report, please visit:
#   http://bugreport.java.com/bugreport/crash.jsp
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.
#

我尝试过的:

  1. Using -mno-cygwin编译时标记,但由于我安装了最新版本的 Cygwin,因此不再支持它。

  2. Using -mno-cygwin标志与gcc-3而不是 gcc - 但 Cygwin 无法识别gcc-3命令。

  3. 添加环境变量。这似乎是常见的解决方案,但不知何故它对我不起作用。在我的系统上,Cygwin 安装在D:\Programy\Cygwin,因此我添加到的文件夹PATH is D:\Programy\Cygwin\bin,如图所示picture http://s4.postimg.org/pqqlhnuzh/image.png(抱歉,外部链接,我没有足够的声誉来发布图片)。

从我读过的所有答案来看,这个should有效,但事实并非如此。 Cygwin 不直接位于 C:\Cygwin 中是否存在问题?或者我做错了什么?我检查了文件夹,那里iscygwin1.dll,它没有丢失。

我在 64 位 Windows 8 上运行。 Cygwin版本:1.7.35-1,安装了整个Devel包。 GCC 版本是 4.9.2。

很抱歉这篇文章很长,我只是想提供尽可能多的信息。我已经被这个问题困扰好几天了,很高兴得到任何建议。

Edit:我刚刚注意到编译我的 C 文件gcc上面的命令不会产生任何可执行文件,我觉得很奇怪。它也不会抛出任何错误或警告。对这个有什么想法吗?难道这就是我的麻烦的根源吗?

Edit 2:我刚刚发现这不应该是一个问题,我实际上是在制作一个库,而不是一个可执行文件。

Edit 3:好吧,我放弃了。这似乎是一个比我最初想象的要大得多的问题。无法做到这一点的原因是cygwin1.dll无法动态加载,因为它在初始化时需要 4k 底部堆栈字节才能释放 - 如果从 JNI 调用它,这可能会出现问题。那里are一些克服它的方法;如果您正在寻找解决方案,这个帖子 http://lists-archives.com/cygwin/28776-creating-a-dll-in-cygwin-for-use-with-jni-without-mno-cygwin.html很好地总结了需要做什么this one http://elliotth.blogspot.cz/2005/08/porting-jni-code-to-win32-with-cygwin.html也可能有用。对于我的项目来说,这并不值得——但祝你好运。


我发现这不能做到的原因是cygwin1.dll无法动态加载,因为它在初始化时需要 4k 底部堆栈字节才能释放 - 如果从 JNI 调用它,这可能会出现问题。

There are一些克服它的方法;如果您正在寻找解决方案,这个帖子 http://lists-archives.com/cygwin/28776-creating-a-dll-in-cygwin-for-use-with-jni-without-mno-cygwin.html很好地总结了需要做什么this one http://elliotth.blogspot.cz/2005/08/porting-jni-code-to-win32-with-cygwin.html也可能有用。我还找到了一个明确的解决方案here https://www.sourceware.org/ml/cygwin/2004-06/msg00274.html.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法使用 Cygwin 从 Java 运行 C 程序 的相关文章

随机推荐

  • 切片如何包含自身?

    我正在尝试使用 The Go 编程语言 来学习 Golang 并且我已经到达了关于切片的部分 它们在数组和切片之间进行比较 因为两个数组可以与 其中两片不能 正文如下 operator for arrays of strings it ma
  • Mongo 上按日期字符串(升序)排序

    我有一个数据库 其中的日期列格式为 dd mm yyyy 我想按日期升序排序 cursor collection gt find filter gt sort array date gt 1 tripID gt 1 日期是一个字符串 我也在
  • 立即获取整数中最左边活动位的索引[重复]

    这个问题在这里已经有答案了 如何从左到右而不是从右到左扫描整数 二进制 我知道我可以从左边开始尝试每一位 然后记录最左边的位 但是有没有更快的方法 是否有一个内置函数可以立即找到整数中最左边的有效位 即 1 我知道从右到左 我可以做类似的事
  • 如何在 ASP.NET Core 3.0 Preview 5 中将声明映射选项传递给 IdentityServerJwt?

    灵感来自关于自定义声明的文章 https korzh com blogs net tricks aspnet identity store user data in claims 我已将租户 ID 自定义声明添加到我的身份服务器登录过程中
  • 如何在Android Studio中调试?

    我怎么能够 设置断点 在断点处停止 发布 但保持调试模式 我所说的释放是指不要进入下一行 跳转到下一个断点 或者只是等到断点被击中 我没有时间也没有意愿深入研究 SDK 类 我只是想在完成几行之后就退出 到目前为止 我唯一能做的就是终止调试
  • 如何将 ALAsset 中的视频显示到 UICollectionview ios

    我尝试使用下面的代码从照片库中获取所有视频ALAsset 现在 我想将所有视频显示到UICollectionview但它似乎没有显示任何东西 请给我一些建议 提前致谢 ViewDidLoad 从照片库获取所有视频 allVideos NSM
  • 跨源资源共享(CORS)——我在这里遗漏了什么吗?

    我正在读关于CORS https developer mozilla org en HTTP access control我认为实施既简单又有效 然而 除非我遗漏了什么 否则我认为规范中遗漏了很大一部分 据我了解 外国站点根据请求的来源 以
  • 用于数据分析目的的特定 postgresql 服务器配置

    如果您使用 postgresql 数据库 是否有关于使用 postgresql conf 文件调整服务器性能的任何提示具体来说用于数据科学部门和数据分析目的 或者性能调整本身与目的无关 并且您将用它做什么没有真正的区别 因为 这都是关于提取
  • 制作因子变量的频率直方图

    我对 R 很陌生 所以我对这样一个基本问题表示歉意 我花了一个小时谷歌搜索这个问题 但找不到解决方案 假设我的数据集中有一些关于常见宠物类型的分类数据 我将其作为 R 中的字符向量输入 其中包含不同类型动物的名称 我是这样创建的 anima
  • 无法在 GitLab 上执行合并请求

    将 GitLab 从 6 2 更新到 7 1 后 我无法执行合并请求 它告诉我没有任何东西可以合并 但当然有 系统信息 System information System Current User git Using RVM no Ruby
  • 更改选项卡时添加动画

    你好 我有一个包含两个子活动的 TabHost 活动 为子活动添加 左 右 动画的最佳解决方案是什么 此致 Hi最好的解决方案是向布局添加动画假设你有两个选项卡 tabs TabHost this findViewById R id tab
  • 在 postgresql 表中存储带有特殊字符(例如引号或反斜杠)的字符串

    我有一个有价值的字符串 MAX DATE QUERY SELECT iso timestamp MAX time stamp AS MAXTIME FROM observation WHERE offering id HOBART 但是在插
  • UIWebView 上 mediaPlaybackAllowsAirPlay 属性的用途

    UIWebView类参考描述了mediaPlaybackAllowsAirPlay如下 一个布尔值 用于确定是否允许从此视图进行隔空播放 当 mediaPlaybackAllowsAirPlay 设置为 YES 时 如果在我的 iPad 上
  • 放置亚马逊横幅 |角V4

    我将亚马逊横幅放在 Angular Material 2 卡内 但问题是它没有渲染 它显示空 div 可能是什么原因 下面是显示我如何做到这一点的代码
  • 通过 Google Apps 脚本更改文档的权限

    我正在寻找示例脚本 该脚本根据传递给脚本的电子邮件地址和 DocumentID 重置外部电子表格的默认权限 我打算创建一个脚本 可以解析电子邮件中的信息以获取DocumentID和电子邮件 执行权限从默认更改为任何有链接的人 然后通过电子邮
  • 使用 Rx 消除按钮点击的抖动

    我正在尝试制作一个简单的 按钮去抖动器 它将计算过滤的点击次数并通过 TextView 显示它 我想过滤快速 垃圾点击 忽略时间间隔小于 300 毫秒的点击 我做了研究并偶然发现Rx太棒了debounce 理论上应该可以做我想要的事情 或者
  • 如何使用javascript将大图像转换为十六进制?

    如果我尝试将图像转换为十六进制 无论我使用哪个函数 我都会收到此错误消息 该图像的大小为 7 MB 19812 毫秒 清除 1401 2 1455 0 gt 1401 2 1455 0 MB 9 9 0 ms 自上次 GC 以来 8 3 m
  • 有没有办法在 Folium 中绘制许多标记?

    我正在尝试使用 Folium 从 pandas 数据框中读取地理信息 我的代码是这样的 import folium from folium import plugins import pandas as pd operations on d
  • 类型错误:MongoStore 不是构造函数

    我正在制作一个带有谷歌身份验证的网站 我尝试将会话存储在 mongodb 数据库中 但是当我将商店选项添加到我的快速会话中时 它不断给出以下错误 TypeError MongoStore is not a constructor at Ob
  • 无法使用 Cygwin 从 Java 运行 C 程序

    我正在尝试使用 JNI 编写我的第一个 Java C 程序 这是 我的 代码的样子 它是从this http stuf ro calling c code from java using jni网站 HelloWorld java publ