jni学习简单例子

来源:互联网 发布:ceic数据库与wind 编辑:程序博客网 时间:2024/05/16 14:35

最近看了些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 __cplusplusextern "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++中都输出的文本。




2 0
原创粉丝点击