jni学习简单例子

这篇博客介绍了JNI的基础应用,通过一个简单的例子展示了如何在Java中使用native关键字定义方法,使用javah生成头文件,编写C++实现并编译成DLL,最后在Java中调用该DLL实现跨语言交互。文章提到了Eclipse的外部工具配置来简化流程,并展示了成功运行后的输出结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值