一、安装GCC
在windows平台下最主要的gcc
工具是MinGW和Cygwin。大部分情况下都是推荐下载Cygwin的因为它是一个在windows平台上运行的unix模拟环境
MinGW
64位版本的可以下载Mingw-w64
,可以直接百度搜索到。
里面的选项比如说异常处理机制基本上是无关紧要的,选择Structured Exception Handling
( 结构化异常处理 )就可以了, Windows使用自己的异常处理机制
Cygwin
Cygwin的安装程序下载 http://www.cygwin.com/setup-x86_64.exe
在下载时需要选择两个目录
-
安装目录
-
缓存目录(随便一个就可以了)
然后至少需要下载5个包,都在devles
目录下,直接在搜索框里搜索
- gcc-core
- gcc-g++
- make
- cmake
- binutils
之后可以指定下载的镜像源,比如说 “163” 和 阿里云 等等的
注意事项
通常因为网络原因
- 进不去https://sourceforge.net这个网站
- 下载Mingw-64时弹出 “Can not download respository.txt”
- 下载Cygwin时没进度、进度不走
连上手机热点就可以了(实测,在不使用任何镜像的情况下联通和电信的热点下载速度都还是挺可以的)
下载好后可以将bin
目录加在环境变量中,使用gcc -v
或者gcc --version
查看版本
二、配置Clion
环境
在settings(设置)中搜索toolchains(工具链)配置gcc
环境,通常clion会自动检测到
工程目录
新建的工程是直接可以运行的,但是我们至少要头文件目录/include/
和源文件目录/source/
吧。
在CmakeLists.txt
中添加include_directories(include)
指定头文件目录为include/
目录
cmake_minimum_required(VERSION 3.15)
project(demo_test)
include_directories(include)
set(CMAKE_CXX_STANDARD 14)
add_executable(demo_test source/main.cpp)
使用Clion也意味着必须要学会如何使用自动化构建工具,推荐一篇博客cmake使用示例与整理总结
JNI——Java与C交互
C编译步骤
参考自C语言程序编译步骤
步骤 | ||
---|---|---|
预处理 | 宏定义展开、头文件展开、条件编译等,同时将代码中的注释删除 | gcc -E hello.c -o hello.i |
编译 | 检查语法,将预处理后文件编译成汇编文件 | gcc -S hello.i -o hello.s |
汇编 | 将汇编文件生成目标文件(二进制文件) | gcc -c hello.s -o hello.o |
链接 | C语言写的程序是需要依赖各种库的,所以编译之后还需要将库链接到最终的可执行程序中 | gcc hello.o -o hello |
JAVA调用C
JAVA声明native
方法并编译为.class
文件
public class Hello {
public static native int staticMethod(int param);
public native void nonstaticMethod();
static {
System.loadLibrary("Hello");
}
public static void main(String[] args) {
// call static method
int result = Hello.staticMethod(100);
System.out.println(result);
// call non-static method
new Hello().nonstaticMethod();
}
}
javac Hello.java
JAVA生成native
方法的C头文件
javah Hello
并可以看到在当前目录下生成的Hello.h
头文件
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class Hello */
#ifndef _Included_Hello
#define _Included_Hello
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: Hello
* Method: staticMethod
* Signature: (I)I
*/
JNIEXPORT jint JNICALL Java_Hello_staticMethod(JNIEnv*, jclass, jint);
/*
* Class: Hello
* Method: nonstaticMethod
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_Hello_nonstaticMethod(JNIEnv*, jobject);
#ifdef __cplusplus
}
#endif
#endif
新建Hello.c
源文件并实现Hello.h
中申明的方法
#include "Hello.h"
JNIEXPORT jint JNICALL Java_Hello_staticMethod(JNIEnv* env, jclass cls, jint param) {
int result = 0;
for (int i = 0; i <= param; i++) {
result += i;
}
return result;
}
JNIEXPORT void JNICALL Java_Hello_nonstaticMethod(JNIEnv* env, jobject obj) {
printf("Successfully called a non-static method implemented by c!\n");
}
将Hello.c
源文件编译为Hello.dll
动态链接库文件。并需要链接两个文件
jni.h
在JDK的include/
目录下jni_md.h
在JDK的include/win32/
目录下、
如下-I
参数是教主链接的路径
gcc -shared -I"D:\jdk\jdk-8\include" -I"D:\jdk\jdk-8\include\win32" Hello.c -o Hello.dll
运行
java Hello
C调用JAVA
C也是可以通过JNI调用JAVA的,但是比较麻烦而且也不太会有这种需求的出现