`

jni之:window7下MinGw+ eclipse 3.6 + cdt创建第一个jni项目

    博客分类:
  • jni
阅读更多

jni的编写和编译需要有以下这些东西:
1. javah.exe:为java中的native函数生成头文件

2. jni的头文件:实现native函数时要使用jni.h中的东西,我这边是在:
c:\Java\jdk1.6.0_25\include;
c:\Java\jdk1.6.0_25\include\win32

3. c的头文件:使用c的标准库必须要用到,我这边是在:
D:\Program\mingw\include;

4. c++的头文件:使用c++的标准库必须要用到,我这边是在:
D:\Program\mingw\lib\gcc\mingw32\4.8.1\include\c++;
D:\Program\mingw\lib\gcc\mingw32\4.8.1\include\c++\mingw32;
D:\Program\mingw\lib\gcc\mingw32\4.8.1\include\c++\backward;

5. c,c++编译器:编译c, c++需要使用,一般是用g++

上面的东西缺一不可,缺少了要么就是编写代码时无法代码提示,要么就是代码编辑时全是提示错误,要么就是编译时出错等。



接下来就开始创建一个jni工程, 并在创建过程中不断的解决各种问题:
(1)启动eclipse, 选择一个workspace.


(2)启动好后, 新建一个java项目: _code_jni

新建的项目



(3)创建一个java类, com.code.Main



(4)在Main类中添加一些代码



(5)在项目下创建一个jni文件夹, 用来存放jni代码.(项目上右击-> new -> folder -> 输入文件夹名称jni -> finish).


(6)使用之前创建的javah.exe快捷菜单为Main类生成jni头文件(会自动生成到jni文件夹中), 选中Main.java文件, 然后点击工具栏上的javah.exe快捷菜单.


生成的jni头文件:



(7)生成的jni头文件仅仅是一份声明, 接下来要为其编写定义, 但当前的项目是一个java项目, 是无法编译c/c++代码的, 所以首相要将java项目转换为c/c++项目.



(8)接下来创建jni头文件的定义文件, com_code_Main.cpp




同时不要忘了将jni文件夹设置为c++的source folder, 否则c++编译器是不会编译jni文件夹中的文件的.
项目上右击 -> Properties -> C/C++ Gerneral -> Paths and Symbols -> Source Location选项卡 -> Add Folder -> 选择jni文件夹 -> OK



(9)都创建好了, 我们就尝试运行下这个项目吧. 在项目上右击 -> Run As -> Java Application. 但此时遇到了编译错误, 找不到jni.h文件.


原因就是jni.h头文件不会自动添加到编译搜索路径上来, 需要我们手动添加, 那就添加一下, jni头文件的搜索路径(C:/Java/jdk1.6.0_25/include和C:/Java/jdk1.6.0_25/include/win32).
项目上右击 -> Properties -> C/C++ General -> Paths ans Symbols -> Includes选项卡 -> GNU C -> Add -> 分别添加C:/Java/jdk1.6.0_25/include和C:/Java/jdk1.6.0_25/include/win32.


注意:我这边用的4.8.1的MinGW, 所以会自动将c,c++标准库的路径自动添加到编译器搜索路径上来, 如果使用了其它版本的MinGW没能自动添加, 那就手动添加一下好了, 有两种方法来添加:
(1)手动在这边添加
(2)添加在windows的环境变量中, 创建两个变量: C_INCLUDE_PATH和CPLUS_INCLUDE_PATH
c标准库的搜索路径包括(我的机器上是):
D:\Program\mingw\include
D:\Program\mingw\lib\gcc\mingw32\4.8.1\include
D:\Program\mingw\lib\gcc\mingw32\4.8.1\include-fixed
D:\Program\mingw\mingw32\include

c++标准库的搜索路径包括(我的机器上):
D:\Program\mingw\include
D:\Program\mingw\lib\gcc\mingw32\4.8.1\include
D:\Program\mingw\lib\gcc\mingw32\4.8.1\include-fixed
D:\Program\mingw\mingw32\include
D:\Program\mingw\lib\gcc\mingw32\4.8.1\include\c++
D:\Program\mingw\lib\gcc\mingw32\4.8.1\include\c++\mingw32
D:\Program\mingw\lib\gcc\mingw32\4.8.1\include\c++\backward


(10)再次运行项目, 发现没有错误了, 但java控制台上也没有任何输出, 因为还没写代码么, 接下来就开始加入代码.



(11)Main.java类加入代码, 并再次运行.


此时会遇到找不到库文件的错误, 主要有两个原因:
(1)我们需要添加一个jvm的运行参数来告知到哪边去找这个库文件.
(2)生成的库文件还没看到呢


(12)添加一个vm参数来告知到哪去找库文件. 在项目上右键 -> Run As -> Run Configurations -> Arguments标签 -> VM arguments加入: -Djava.library.path=".;${project_loc}\libs;${env_var:PATH}", 然后点击apply应用.



(13)这边将生成的库文件放在libs文件夹下, 所以先创建一个libs文件夹(项目上右击 -> new -> folder -> 输入文件夹名称libs -> finish).
然后配置编译器选项, 在编译好后自动将库文件copy到libs文件夹下; 以及配置生成的库文件名叫什么.

xcopy "${BuildArtifactFilePrefix}${BuildArtifactFileName}" "${workspace_loc:${ProjName}/libs}" /Y


(14)两个都设置好后再次编译项目(注意是编译不是运行哦)


可能会遇到, 无需编译的提示, 只要修改任意一个.cpp文件, 然后执行一下保存, 再编译就可以了:


(15)此时刷新libs文件夹, 发现库文件已经生成了.


如果遇到没生成库文件, 可能就是没创建libs文件夹, 没创建libs文件夹时会有这样的提示.



(16)库文件生成后, 再次运行项目. (项目上右击 -> Run As -> Java Application), 但此时又会遇到一个错误, Exception in thread "main" java.lang.UnsatisfiedLinkError: com.code.Main.getInt()I, 找不到native方法.


初步分析, 找不到getInt方法, 要么就是com_code_Main这些东西没编进.dll中; 要么就是编译器的生成的方法标识符有问题, 后来经过百度, 确定是编译器生成的方法标识符有问题.(http://java.chinaitlab.com/base/838280.html
解决办法就是对MinGW提供的编译器进行一些配置: 项目右击 -> Properties -> C/C++ Build -> Settings -> MinGW C++ Linker -> Miscellaneous -> Tool Settings -> Linker Flags -> 加入: -Wl,--add-stdcall-alias 参数



(17)然后再编译Build, 运行. 发现世界瞬间变美好了, 终于成功了.




参考链接:
轻松使用Eclipse CDT进行Java JNI编程: http://jingyan.baidu.com/article/9c69d48f53575d13c9024ec1.html
Eclipse下配置CDT和MinGW:http://www.cnblogs.com/cuberub/archive/2012/03/24/EclipseCDT.html



创建过程中可能遇到的一些其它问题:
可能遇到的问题:
(1)编译器输出乱码, 菜单 -> Window -> Preferences -> C/C++ -> Build -> Environment -> Add -> 名称: lang, 值: en_US



  • 大小: 35.5 KB
  • 大小: 6.8 KB
  • 大小: 60.1 KB
  • 大小: 8.6 KB
  • 大小: 22.4 KB
  • 大小: 48.6 KB
  • 大小: 99.6 KB
  • 大小: 36.8 KB
  • 大小: 32.4 KB
  • 大小: 94 KB
  • 大小: 24.8 KB
  • 大小: 59.5 KB
  • 大小: 70.7 KB
  • 大小: 88.4 KB
  • 大小: 10.9 KB
  • 大小: 33.9 KB
  • 大小: 62 KB
  • 大小: 14.5 KB
  • 大小: 36 KB
  • 大小: 62.8 KB
  • 大小: 68 KB
  • 大小: 28.7 KB
  • 大小: 55.5 KB
分享到:
评论

相关推荐

    jni之:win7下MinGW安装

    标题“JNI之:Win7下MinGW安装”指的是在Windows 7操作系统中如何安装和配置MinGW,一个为Windows平台提供GCC(GNU Compiler Collection)编译环境的开源工具集。这篇博客文章可能详细介绍了安装步骤,针对那些需要...

    简洁使用 eclipse+mingw 环境编译 java jni

    通过以上步骤,你已经成功地在Eclipse和MinGW环境下构建了一个Java JNI项目。这个过程中,Eclipse提供了方便的集成开发环境,而MinGW则提供了编译C/C++代码的能力。这种组合为Java开发者提供了在不离开熟悉环境的...

    windows+eclipse+cygwin+cdt+ndk配置

    在Windows环境下进行Android原生代码开发,通常会涉及到Eclipse、Cygwin、CDT和NDK这四个组件。下面将详细介绍它们的功能以及如何配置。 首先,Eclipse是一款广泛使用的集成开发环境(IDE),尤其在Java开发领域。...

    JNI开发 eclipse相关开发环境的搭建

    现在,读者已经成功搭建了一个 JNI 开发环境,可以使用 Eclipse 和 CDT 插件来编写和编译 C/C++ 代码,并使用 NDK 和 Cygwin 来编译 JNI 代码。这个环境可以帮助读者更好地开发 JNI 项目,提高开发效率。

    JNI++ User Guide

    2. **创建项目文件:** 使用 JNI++ 的工具创建项目文件。 3. **填充实现:** 根据生成的模板填写 C++ 实现。 4. **构建原生实现库:** 使用自动化的构建脚本构建 C++ 库。 5. **运行应用:** 运行 Java 应用程序。 ####...

    Java通过JNI调用Eclipse、MinGW编译C++出来的dll

    Java通过JNI调用Eclipse、MinGW编译C++出来的dll,仅仅是一个简单的示例,关键是整个流程要走通,详细参见:http://blog.csdn.net/yanzi1225627/article/details/18891613

    JNI综合实验一:LED点亮+IO电平读取

    标题中的“JNI综合实验一:LED点亮+IO电平读取”是指一个关于Java Native Interface (JNI)的实践教程,该教程聚焦于如何利用JNI来控制硬件设备,具体包括LED灯的控制和输入/输出(I/O)电平的读取。在嵌入式系统或...

    jni程序开发简单示例和说明(eclipse + Microsoft Visual Studio 2010).zip

    在Eclipse中,你需要创建一个Java项目,并在其中定义本地方法。这些方法不会被Java虚拟机直接执行,而是通过JNI接口映射到本地代码。例如,你可能会定义一个如下的Java类: ```java public class JniDemo { static...

    inline-jni:JNI到C ++包装器,旨在使JNI更加有用

    内联式JNI JNI到C ++包装器,旨在使JNI更加有用JNI功能的仅标头包装器,使从C ++执行Java代码的工作变得更轻松。 该库大量使用C ++ 11用户定义的文字,使用的最低GCC版本为4.8这是做什么用的? 最初,我使用它来实现...

    windows下 eclipse+ndk编译及使用jni示例

    1.) 在项目根目录下创建jni目录,下面是要放进去的第一个文件Android.mk LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := main_jni #LOCAL_CFLAGS := LOCAL_SRC_FILES := main.cpp #LOCAL_...

    JNI++ 用户手册(英文),JNI++ User Guide

    JNI++是JNI的一个封装库,它提供了一套更简洁、易于理解和使用的API,使得在Java应用中调用C++/C代码变得更为便捷。 1. **JNI基础概念** - **本地方法接口**:JNI是Java虚拟机(JVM)与本地代码(如C/C++)通信的...

    WindowBuilder+eclipse3.5.x整合使用

    - 安装完成后,重启Eclipse,新建一个Java项目,然后选择“New” -> “SWT Designer”或“JFace Designer”来创建新的GUI窗口。 - 可以在设计视图和源码视图之间切换,实时预览GUI界面并调整代码。 6. **使用...

    JNI DEMO:java jni技术 调用 c/c++ 的dll

    接下来,我们需要创建一个C/C++源文件,包含之前由`javah`生成的头文件,并实现这些native方法。在这个实现中,我们将使用Windows API来加载和调用DLL中的函数。例如,我们可以使用`LoadLibrary`函数加载DLL,`...

    android eclipse jni(ndk) 开发环境的搭建

    - 在项目的根目录下创建一个名为`jni`的文件夹,用于存放C/C++源代码和必要的构建脚本。 - 在`jni`文件夹内创建一个`Android.mk`文件,定义待编译的源代码文件和生成的目标文件。例如: ```makefile LOCAL_PATH :=...

    Eclipse+CDT+GDB调试android_NDK程序

    【Eclipse+CDT+GDB调试Android NDK程序】是一种在Android平台上调试原生C/C++代码的有效方法。在Android应用开发中,有时需要利用NDK(Native Development Kit)来编写高性能或底层的代码,这时就需要使用调试工具来...

    Eclipse里Android JNI的开发方法

    - 在项目根目录下创建一个名为`jni`的文件夹,用于存放与NDK相关的源代码和编译文件。 - **构建器设置**: - 打开项目属性(Project -> Properties)。 - 导航至“构建器”(Builders)选项卡。 - 新建一个构建...

    Eclipse JNI Demo

    【Eclipse JNI Demo】是一个基于Eclipse开发的Java Native Interface(JNI)示例项目,用于演示如何在Android应用中使用JNI技术。JNI是Java平台的标准编程接口,它允许Java代码和其他语言写的代码进行交互,特别是在...

    Eclipse下JNI演示Demo

    本教程将详细讲解如何在Eclipse环境下利用CDT(C/C++ Development Tools)和TDM-GCC编译器来创建和运行一个简单的JNI演示示例。我们将涵盖两种情况:使用默认包和自定义包。 首先,我们需要安装CDT插件以支持C/C++...

Global site tag (gtag.js) - Google Analytics