您的位置:首页 > 编程语言 > Java开发

jni学习简单例子

2016-02-24 17:18 585 查看
最近看了些jni的东西,简单学着写了点,工程目录结构如图



首先主要java 类,代码如下:

package jni;

public class MyJni {

static {
System.loadLibrary("MyJNI");
}

public native String getStr(String str);

public MyJni() {
// TODO 自动生成的构造函数存根

System.out.println(getStr("g++"));
}

public static void main(String[] args) {
new MyJni();
}
}


jni方法用native修饰

然后使用javah命令生成头文件,命令为

javah -classpath 工程目录\bin\ -d 工程目录\jni -jni jin.MyJni


-classpath 指定class文件的目录,-d 输出的目录, jin.MyJni 是要生成头文件的java类

使用eclipse的话可以添加外部工具,可以很方便生成头文件,具体方法以后再写

下面是生成的头文件

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

#ifndef _Included_jni_MyJni
#define _Included_jni_MyJni
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class:     jni_MyJni
* Method:    getStr
* Signature: (Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_jni_MyJni_getStr
(JNIEnv *, jobject, jstring);

#ifdef __cplusplus
}
#endif
#endif


然后是对应的c++的源码

<pre name="code" class="cpp">#include <jni.h>
#include "jni_MyJni.h"
#include <iostream>
using std::cout;
using std::endl;

JNIEXPORT jstring JNICALL Java_jni_MyJni_getStr
(JNIEnv * env, jobject, jstring pram)
{
jstring str=env->NewStringUTF("fdsf");
const char *dname=NULL;
dname = env->GetStringUTFChars(pram, 0);
printf("%s",dname);
return str;
}




jni.h文件是java的jdk里的,编译环境需要添加jdk目录,否则找不到

jni_MyJni.h就是刚才用javah命令生成的头文件

c++代码就是返回一个jstring字符串,并输出一段字符

c++需要编译成dll文件才能调用,我使用minGW进行编译。

可以新建一个c++项目,进行编译,不过还有方便的方法,eclipse的外部工具可以帮助编译,具体方法也是以后再写。

编译完成后生成我们需要的MyJNI.dll

此时java还找不到此文件了,我们需要配置工程的构建路径,项目上右键-》构建路径-》配置构建路径-》添加库-》插件依赖项-》完成

点开那个折叠箭头

如图


本机库位置编辑,工作空间,选择你MyJNI.dll文件位置。然后编译运行java方法,就可以正常运行了。结果如下图:



java和c++中都输出的文本。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  jni java