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