我的操作系统是windows10,安装的是 cygwin 64位,需要实现的功能很简单,java函数中调用jni函数打印 hello jni
HelloJni.java
public class HelloJni {
native void hello();
static {
System.loadLibrary("HelloJni");
}
public static void main(String args[]) {
HelloJni helloJni = new HelloJni();
helloJni.hello();
}
}
执行 javac HelloJni.java生成了HelloJni.class
执行javah HelloJni 生成HelloJni.h
/* DO NOT EDIT THIS FILE - it is machine generated */
#include
/* Header for class HelloJni */
#ifndef _Included_HelloJni
#define _Included_HelloJni
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: HelloJni
* Method: hello
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_HelloJni_hello
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
首次执行
g++ -I"C:\Program Files\Java\jdk1.8.0_171\include" -I"C:\Program Files\Java\jdk1.8.0_171\include\win
32" -shared HelloJni.c -o HelloJni.dll
报错
In file included from C:\Program Files\Java\jdk1.8.0_171\include/jni.h:45:0,
from HelloJni.h:2,
from HelloJni.c:2:
C:\Program Files\Java\jdk1.8.0_171\include\win32/jni_md.h:34:9:
error: '__int64' does not name a type
提示很明显:
error: '__int64' does not name a type
加上 -D"__int64=long long" 重新编译
g++ -D"__int64=long long" -I"C:\Program Files\Java\jdk1.8.0_171\include" -I"C:\Program Files\Java\jd
k1.8.0_171\include\win32" -shared HelloJni.c -o HelloJni.dll
编译不报错
S C:\cygwin64\bin> java HelloJni
#
# A fatal error has been detected by the Java Runtime Environment:
#
# EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x0000000180119727, pid=5624, tid=0x0000000000001a88
#
# JRE version: Java(TM) SE Runtime Environment (8.0_171-b11) (build 1.8.0_171-b11)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.171-b11 mixed mode windows-amd64 compressed oops)
# Problematic frame:
# C [cygwin1.dll+0xd9727]
#
# Failed to write core dump. Minidumps are not enabled by