一、安裝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的,但是比較麻煩而且也不太會有這種需求的出現