Til*_*aen 6 c java windows gcc cygwin
我正在尝试使用JNI创建我的第一个Java/C程序.以下是"我的"代码的外观 - 它是从这个网站复制的:
/* HelloWorld.java */
public class HelloWorld {
native void helloFromC();
static {
System.loadLibrary("ctest");
}
static public void main(String argv[]) {
HelloWorld helloWorld = new HelloWorld();
helloWorld.helloFromC();
}
}
Run Code Online (Sandbox Code Playgroud)
C部分:
/* ctest.c */
#include <jni.h>
#include <stdio.h>
JNIEXPORT void JNICALL Java_HelloWorld_helloFromC
(JNIEnv * env, jobject jobj)
{
printf("Hello from C!\n");
}
Run Code Online (Sandbox Code Playgroud)
通过Cygwin,我成功地做到了
javac HelloWorld.java
javah HelloWorld
Run Code Online (Sandbox Code Playgroud)
创建一个这样的头文件:
/* 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
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.我也可以使用以下代码编译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
Run Code Online (Sandbox Code Playgroud)
现在我应该可以做到
java HelloWorld
Run Code Online (Sandbox Code Playgroud)
从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.
#
Run Code Online (Sandbox Code Playgroud)
我尝试过的:
-mno-cygwin
在编译时使用标志,但由于我安装了最新版本的Cygwin,因此不再支持它.
使用-mno-cygwin
flag gcc-3
而不是gcc - 但是Cygwin不识别gcc-3命令.
添加环境变量.这似乎是常见的解决方案,但不知何故它对我不起作用.在我的系统不同,Cygwin安装在D:\Programy\Cygwin
,所以我添加到文件夹PATH
是D:\Programy\Cygwin\bin
,如图所示的图片(对不起,外部链接,我没有足够的声誉张贴图片).
从我读过的所有答案中,这个应该有用,但事实并非如此.是不是Cygwin没有直接在C:\ Cygwin中出现问题?或者我做错了什么?我检查了文件夹,还有就是 cygwin1.dll,这不是失踪.
我正在运行Windows 64,64位.Cygwin的版本:1.7.35-1,安装了整个Devel包.GCC版本是4.9.2.
对不起,我只想提供尽可能多的信息.我已经坚持了几天这个问题,并且很乐意提出任何建议.
编辑:我只是注意到用gcc
上面的命令编译我的C文件不会产生任何可执行文件,我觉得很奇怪.它也不会抛出任何错误或警告.关于这个的任何想法?这可能是我麻烦的根源吗?
编辑2:我刚刚发现这应该不是问题,我实际上是在创建一个库,而不是一个可执行文件.
编辑3:好的,我放弃了.这似乎比我最初想象的要大得多.无法做到这一点的原因是cygwin1.dll
无法动态加载,因为它需要4k的底部堆栈字节在初始化时是免费的 - 如果从JNI调用它可能会有问题.目前有一些方法来克服它; 如果你正在寻找一个解决方案,这篇文章总结了很多需要做的事情,这个也很有用.对于我的项目来说,这不值得 - 但祝你好运.
归档时间: |
|
查看次数: |
941 次 |
最近记录: |