使用Eclipse CDT进行Java JNI编程

           Java程序可以通过JNI(Java Native Interface,Java本地调用)访问本地的动态链接库,从而扩展其功能、保护关键代码、提高运行效率        

            需要使用java进行jni调用C++代码,折腾了半天,整理过程如下。

                   CDT及MinGW配置参见博客另外一篇文章:

                            http://blog.csdn.net/q838197181/article/details/37727877

 

 

1.创建一个Java project

创建一个名为“JNI Test”的Java project,创建一个名为“com.example.jni.JNITest”的class,其内容如下。同时在该project下创建resources文件夹,用来存放动态库文件。


 

package com.example.jni;

public class JNITest { 

static {          

// 调用文件名为JNI Library.dll的动态库        

System.loadLibrary("libJNI Library");      

}       

public static void main(final String[] args) {

new JNITest().hello("world");      

}       

// native方法声明      

public native void hello(String name);  

} 

2.根据Java类文件创建C++的头文件

在命令行下,进入Java项目的bin文件夹(例如cd G:\Users\K\workspace\JNI Test\bin

进入工程目录的bin文件夹下   我输入的是   javah -classpath . com.example.jni.JNITest

执行javah com.example.jni.JNITest ,即可在bin目录下生成C++的头文件,其内容如下图。

JNIEXPORT void JNICALL Java_com_example_jni_JNITest_hello(JNIEnv *, jobject, jstring)这个函数就是我们接下来要实现的。

 

如果提示javah命令不存在,说明JDK的bin目录未加入到系统环境变量Path中,请先进行添加。

内容如下:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_jni_JNITest */

#ifndef _Included_com_example_jni_JNITest
#define _Included_com_example_jni_JNITest
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_example_jni_JNITest
 * Method:    hello
 * Signature: (Ljava/lang/String;)V
 */
JNIEXPORT void JNICALL Java_com_example_jni_JNITest_hello
  (JNIEnv *, jobject, jstring);

#ifdef __cplusplus
}
#endif
#endif

3.创建C++项目

创建名为“JNI Library”的C++项目,新建一个Cpp文件,在该文件中将实现头文件中声明的函数,其内容如下。此时编译器会提示代码有错,因为没有设置头文件包含路径,我们在下一步进行设置。

#include <iostream>

#include "com_example_jni_JNITest.h"

using namespace std;


JNIEXPORT void JNICALL Java_com_example_jni_JNITest_hello(JNIEnv *env,

jobject jthis, jstring data) {

jboolean iscopy;

const char *charData = env->GetStringUTFChars(data, &iscopy);

cout << "Hello " << charData << endl;

env->ReleaseStringUTFChars(data, charData);

}

4.配置C++项目的头文件目录,使其包含jdk的头文件目录(具体目录请根据自己的JDK安装路径来)。

配置方法:在左侧的“JNI Library”项目上右击,选择Properties -> C/C++ General -> Path and Symbols,按下图进行设置,点OK保存。



5.

配置C++项目的链接参数,使JNI能够使用。具体每步都有截图。

同样地,在左侧的“JNI Library”项目上右击,选择Properties。

(1)左侧点击 C/C++ Build/Settings,在MinGW C++ Linker/Miscellaneous/Linker Flags中添加的参数为“-Wl,--add-stdcall-alias

(2)在MinGW C++ Linker/Shared Library Settings中勾选Shared

(3)在C/C++ Build/Settings的Build Steps选项页的Post-build Steps添加以下内容,这样C++项目Build完成后就会自动将动态库文件拷贝到JNI Test项目的resources文件夹。

xcopy "${BuildArtifactFilePrefix}${BuildArtifactFileName}" "${workspace_loc:/JNI Test/resources/}" /Y

(4)在C/C++ Build/Settings的Build Arifact选项页中,设置Artifact Type为Shared Library

(5)记得点OK保存哦。此时右击C++项目-> Build Project,应该会成功编译,并提示复制了1个文件(记得在在JNI Test这个Java项目下创建resources文件夹,这样才会复制成功哦)

运行Java项目“JNI Test”

(1)在Eclipse左侧右击“JNI Test”,Run as->Java Application即可,此时会提示有错,我们接下来就解决这个问题(一定要先尝试运行一次,即使出错)。

(2)点击菜单Run -> Run Configurations,按下图设置参数,指定动态库位置。参数为 -Djava.library.path="${workspace_loc}/JNI Test/resources;${env_var:PATH}"

(3)点击Run再次运行就会运行成功啦。


注意:如果还是出错,可以尝试将java代码中的System.loadLibrary("libJNI Library") 改为System.loadLibrary("JNI Library")

 

           

 

          

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值