`

在windows下使用gcc编译jni的简单教程

 
阅读更多
1、安装MinGW,这个可以为windows提供gcc编译环境。

到http://sourceforge.net/projects/mingw/files/ 下载,是.exe的,在线安装,但很快。安装时选c compiler就行了,也可以把c++的也装了。安装完成后,为了方便使用最好配置一下环境变量。把MinGW/bin目录加入环境变量。



2、编写JAVA文件。

写个最简单的:

public class Test 
{
     static
     {
         System.loadLibrary("lib");   
     }     

     static native void print(int a);    

     public static void main (String args[]) 
     {
        print(3);   
     } 
} 

然后编译java文件 javac Test.java


3、生成.h头文件。

javah Test

就这一个简单的命令就行了。(如果有包名,需要类似javah com.google.Test这样,注意命令行目录)



4、实现.c文件。

.h生成后可以打开看一下,里面有个方法是需要自己实现的。如下:

JNIEXPORT void JNICALL Java_Test_print
(JNIEnv *, jclass, jint);

这个就是我们java里写的print方法了。

这里简单说一下c的方法名命名规则是Java_packagename_Classname_method

要实现的就是这个方法了。

#include <stdio.h> 
#include <jni.h> 
#include "Test.h"
   JNIEXPORT void JNICALL Java_Test_print(JNIEnv *env, jclass jthiz,jint a)
   {
      printf("Hello JNI!%d\n",a); 
   } 

这里简单说一下,include的第一个是c的标准输入输出库,第2个是jni库,这个文件是在java/include里的,第3个就是自己刚才生成的头文件了,注意一定要用“”,不是用<>

方法的前2个参数是固定的,不用管。



5、把.c文件编译成.dll

命令:

gcc -I%JAVA_HOME%\include -I%JAVA_HOME%\include\win32 -shared -Wl,–kill-at -s -o lib.dll Test.c



解释一下:

-I(大写字母I,include的意思)是加入自己的库,也就是告诉编译器jni.h的位置。当然不加这个参数也可以,自己把jni.h和jni_md.h文件复制出来和Test.c放一起,另外include改为”"

-shared表示编译成.dll库文件

-s参数可以大幅减小.dll文件的大小,不加也可以

-o表示目标文件名,不加也可以,会有默认名,但要自己改成java中导入库的名字,这里是lib

-Wl,–kill-at  这个参数我也不明白,反正要加,不加能编译成.dll,但java中会报错。(是小写字母L,不是数字1)



好了,java Test看结果吧。

Tags: gcc, java, jni, mingw, 教程

Categories: Java


转自:http://veikr.com/201207/windows_gcc_jni.html
分享到:
评论

相关推荐

    编译JNI的gcc指令代打和测试例程

    使用gcc和g++编译jni指令太长,很麻烦。所以做了一个编译工具JNIBuilder.jar。 因为是用于jni的,所以默认使用者的电脑上已经安装好Java和MinGW,并且可用。 并提供一个测试例程。功能是jni函数调用java函数弹出一个...

    gcc makeFile入门(三)JNI.rar

    cygwin 下通过gcc编译dll文件,交给java调用

    cygwin可以编译生成windows下供调用的dll

    cygwin可以编译生成windows下供调用的dllcygwin可以编译生成windows下供调用的dllcygwin可以编译生成windows下供调用的dll

    JNI指令代打2.0

    使用gcc和g++编译jni指令太长,很麻烦。所以做了一个编译工具JNIBuilder.jar。 因为是用于jni的,所以默认使用者的电脑上已经安装好Java和MinGW,并且可用。 并提供一个测试例程。功能是jni函数调用java函数弹出一个...

    gradle-jni-example:展示如何使用 gradle 编译 CC++ JNI 代码的示例应用程序

    展示如何使用 gradle 编译 C/C++ JNI 代码的示例应用程序 这个项目需要 gradle 2.3 来匹配原生编译 DSL。 本机编译目前支持两种工具链:gcc 和 clang。 gradle 本机插件会扫描路径并选择可用的“最佳”工具,尽管...

    jni_tutorial:JNI(Java本机接口)教程

    面向初学者的JNI(Java本机接口)教程介绍本教程将向您简要说明如何在Java VM代码和本机OS之间创建简单的资源访问您将学到什么: 在C中创建一个共享库,其中包含简单的基本功能和简单的资源来访问您的系统在C中创建...

    ScratchJavaJNI:一个演示Java JNI API示例,可用作Java Native Interface项目的起点

    要在Linux上编译并运行(您需要正确安装gcc和JDK),请使用提供的简单Makefile执行以下操作: makemake run输出将是这样的:Hello World (https://gianlu.dev/) 14!The response from C is: I'm the C boss!要从C...

    keccak-jni:使用 keccak sha3 计算作为 JNI 调用来赢得 64 位 DLL

    创建 javah 桥javah -d ./jni -cp ./src/main keccak.KeccakJNI 实现 keccak_KeccakJNI.c 设置编译环境设置 gcc_run=C:\mingw-w64\mingw64\bin\gcc.exe 设置路径=%PATH%;C:\mingw-w64\i686-4.9.2-posix-dwarf-rt_v4-...

    Android NDK(r5b)环境搭建及JNI实现

    1. 下载android-ndk-r5b-windows并解压到D:\android-ndk-r5b-windows 2. 下载Cygwin, 执行setup.exe并开始安装 注意:.开发选项里必须勾选gcc和make,否则后期无法编译 3. 配置NDK环境变量

    brainscala:在 Scala 中胡思乱想!

    Brainfuck 在 Scala 中使用无限内存磁带! 使用sbt assembly构建 主要选项 -c将输入转换为文字字符串 -v打印详细输出(目前还没有) -e输出指针上的最后一个值作为退出代码。 引擎 interpret解释脚本而不编译成...

    Linux下安装并使用Java开发opencv的配置

    花了四个小时,终于在linux下把eclipse下java开发opencv给搞定了…至于为什么花这么久的时间…且听我慢慢讲…  linux编译安装opencv  首先,linux下安装opencv其实不麻烦的,参考文档即可完成:...

    java_com_c:在c中创建要在Java中使用的库

    在c中创建要在Java中使用的库 我需要创建一个例程,将c中的lib与java集成在一起。 下面,我将逐步向您展示如何逐步完成此工作。 1-Java中的示例程序: HelloWorld.java 2-编译代码以查看是否没有错误: javac ...

    sgscript:SGScript脚本引擎

    Android NDK用户:将jni / Android.mk包含在您的makefile中 示例代码和文档 查看examples/ , tests/和docs/目录。 要构建本地HTML5文档,请使用“制作文档”。 可以在文档中找到更多示例代码: : 特征 类似

    Familia-Java:用于在java理解和调试baidu Familia

    d src/test/jni -force -jni familia.java.util.CMinstdRand0编译 gcc -fPIC -D_REENTRANT -I${JAVA_HOME}/include -I//develop/jdk1.6.0_31/include/linux -shared -o hellojni.so HelloJni.c cl -I "%JAVA_HOME%/...

    mingw_x86_64-posix-seh

    最近在弄window上的jni,需要编译dll,用到了minigw,从官网上下载64位太慢了而且经常失败,就把我下载好的上传上来了。

Global site tag (gtag.js) - Google Analytics