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

[size=medium]
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
[img]http://dl2.iteye.com/upload/attachment/0090/7889/4ba7096b-c728-3add-8dcd-d46debf71418.png[/img]
新建的项目
[img]http://dl2.iteye.com/upload/attachment/0090/7891/c8ed6629-481f-394b-bef0-b8874830d611.png[/img]


(3)创建一个java类, com.code.Main
[img]http://dl2.iteye.com/upload/attachment/0090/7895/fa7e8833-7bbc-33f1-bf9f-42902ec9f6eb.png[/img]


(4)在Main类中添加一些代码
[img]http://dl2.iteye.com/upload/attachment/0090/7897/992d5f4d-649a-38c2-ad37-8ab5a14d0440.png[/img]


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


(6)使用之前创建的javah.exe快捷菜单为Main类生成jni头文件(会自动生成到jni文件夹中), 选中Main.java文件, 然后点击工具栏上的javah.exe快捷菜单.
[img]http://dl2.iteye.com/upload/attachment/0090/7899/0066fe07-45c7-34e2-b76c-96fc4ed3bafb.png[/img]

生成的jni头文件:
[img]http://dl2.iteye.com/upload/attachment/0090/7901/def6070d-4bd0-3fef-ac28-a431011baff6.png[/img]


(7)生成的jni头文件仅仅是一份声明, 接下来要为其编写定义, 但当前的项目是一个java项目, 是无法编译c/c++代码的, 所以首相要将java项目转换为c/c++项目.
[img]http://dl2.iteye.com/upload/attachment/0090/7903/216d3792-731a-328d-b4dd-9ac1ed0d3b7c.png[/img]


(8)接下来创建jni头文件的定义文件, com_code_Main.cpp
[img]http://dl2.iteye.com/upload/attachment/0090/7905/cd88f079-481f-3156-be28-f7a619c41912.png[/img]

[img]http://dl2.iteye.com/upload/attachment/0090/7929/2a112d5a-269a-3135-9602-1f43e8c4dd3d.png[/img]

[b]同时不要忘了将jni文件夹设置为c++的source folder, 否则c++编译器是不会编译jni文件夹中的文件的.[/b]
项目上右击 -> Properties -> C/C++ Gerneral -> Paths and Symbols -> Source Location选项卡 -> Add Folder -> 选择jni文件夹 -> OK
[img]http://dl2.iteye.com/upload/attachment/0090/7943/b3773eb8-564b-3192-911f-58b8067a0fb1.png[/img]


(9)都创建好了, 我们就尝试运行下这个项目吧. 在项目上右击 -> Run As -> Java Application. 但此时遇到了编译错误, 找不到jni.h文件.
[img]http://dl2.iteye.com/upload/attachment/0090/7907/f17dea0f-b771-3b2c-8dd9-5fc1859e519f.png[/img]

原因就是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.
[img]http://dl2.iteye.com/upload/attachment/0090/7909/86d17728-2af1-3b6a-99ad-0b121e0d321d.png[/img]

[b]注意:[/b]我这边用的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控制台上也没有任何输出, 因为还没写代码么, 接下来就开始加入代码.
[img]http://dl2.iteye.com/upload/attachment/0090/7917/c65e48f5-cb68-3451-8afa-2d308f5ae98a.png[/img]


(11)Main.java类加入代码, 并再次运行.
[img]http://dl2.iteye.com/upload/attachment/0090/7923/486dc2c9-ebff-351f-840a-d22d6cf924a4.png[/img]

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


(12)添加一个vm参数来告知到哪去找库文件. 在项目上右键 -> Run As -> Run Configurations -> Arguments标签 -> VM arguments加入: -Djava.library.path=".;${project_loc}\libs;${env_var:PATH}", 然后点击apply应用.
[img]http://dl2.iteye.com/upload/attachment/0090/7925/b734a939-e133-333a-a5ba-dfd855e0c14d.png[/img]


(13)这边将生成的库文件放在libs文件夹下, 所以先创建一个libs文件夹(项目上右击 -> new -> folder -> 输入文件夹名称libs -> finish).
然后配置编译器选项, 在编译好后自动将库文件copy到libs文件夹下; 以及配置生成的库文件名叫什么.
[img]http://dl2.iteye.com/upload/attachment/0090/7927/6389a994-3b70-33ed-b0dd-d48f4bd583b1.png[/img]
xcopy "${BuildArtifactFilePrefix}${BuildArtifactFileName}" "${workspace_loc:${ProjName}/libs}" /Y


(14)两个都设置好后再次编译项目(注意是编译不是运行哦)
[img]http://dl2.iteye.com/upload/attachment/0090/7933/e972470f-4e31-3831-97ec-05414c116747.png[/img]

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


(15)此时刷新libs文件夹, 发现库文件已经生成了.
[img]http://dl2.iteye.com/upload/attachment/0090/7937/2e151f39-7704-3452-a976-cf15e7d90e93.png[/img]

如果遇到没生成库文件, 可能就是没创建libs文件夹, 没创建libs文件夹时会有这样的提示.
[img]http://dl2.iteye.com/upload/attachment/0090/7939/07fa26e0-50f2-3e6c-839e-8d999ba39c61.png[/img]


(16)库文件生成后, 再次运行项目. (项目上右击 -> Run As -> Java Application), 但此时又会遇到一个错误, Exception in thread "main" java.lang.UnsatisfiedLinkError: com.code.Main.getInt()I, 找不到native方法.
[img]http://dl2.iteye.com/upload/attachment/0090/7941/69f39dd5-2ae2-3eac-aa5a-918dfd69ef40.png[/img]

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


(17)然后再编译Build, 运行. 发现世界瞬间变美好了, 终于成功了.
[img]http://dl2.iteye.com/upload/attachment/0090/7949/9aa0c7d4-b465-33bb-9d77-a4b4880004a0.png[/img]


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


创建过程中可能遇到的一些其它问题:
可能遇到的问题:
(1)编译器输出乱码, 菜单 -> Window -> Preferences -> C/C++ -> Build -> Environment -> Add -> 名称: lang, 值: en_US
[img]http://dl2.iteye.com/upload/attachment/0090/7951/441534b9-02ff-3fb0-9430-589e54b78f75.png[/img]

[/size]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值