eclipse下JNI的初步实现

2023-11-07

eclipse下JNI的初步实现

     JNI=java native interface, 为java应用程序提供调用本地方法的接口
     The standard Java class library may not support the platform-dependent features needed by your application.
    You may already have a library or application written in another programming language and you wish to make it accessible to Java applications.
    You may want to implement a small portion of time-critical code in a lower-level programming language, such as assembly, and then have your Java application call    these functions

步骤:
1.编写带有native声明的方法的java类

package  jni;

public   class  HelloWorld  ... {
    
static...{
        System.loadLibrary(
"hellodll");
    }


    
public native void dispHelloWorld();
    
/** *//**
     * 
@param args
     
*/

    
public static void main(String[] args) ...{
        
// TODO Auto-generated method stub
        
//System.out.println("abc");
        new HelloWorld().dispHelloWorld();
    }


}


2,保存后如果没有错误eclipse会编译产生jni/HelloWorld.class


3,假设工程产生的class都在 classes文件夹下(这个文件夹名字跟个人eclipse设置有关,也可能就是工程根目录),那么控制台cd到classes用javah命令产生h 文件,XXX/classes>javah -jni jni.HelloWorld(package不要漏掉),产生的jni_HelloWorld.h文件如下


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

#ifndef _Included_jni_HelloWorld
#define  _Included_jni_HelloWorld
#ifdef __cplusplus
extern   " C "   ... {
#endif
/**//*
 * Class:     jni_HelloWorld
 * Method:    dispHelloWorld
 * Signature: ()V
 
*/

JNIEXPORT 
void JNICALL Java_jni_HelloWorld_dispHelloWorld
  (JNIEnv 
*, jobject);

#ifdef __cplusplus
}

#endif
#endif

4,写cpp,实现jni_HelloWorld.h中的函数,这里请注意函数名,cpp里的函数名跟h文件的函数名要一致,如果是从网上 copy的一些例子,函数名跟你例子的名字不一致虽然之后可以正确编译并产生dll,但是最终运行java程序链接的时候会出错,抛出 java.lang.UnsatisfiedLinkError异常,本人就在此浪费了很长时间。


jni_HelloWorldImp.cpp内容如下:


#include  < jni.h >
#include 
" jni_HelloWorld.h "
#include 
< stdio.h >
JNIEXPORT 
void  JNICALL Java_jni_HelloWorld_dispHelloWorld
(JNIEnv 
* env, jobject obj)
... {
    printf(
"Hello world !");
    
return;
}

5,编译cpp产生dll,在控制台下>cl -I%java_home%\include -I%java_home%\include\win32 -LD jni_HelloWorldImp.cpp -Fehellodll.dll

以上命令的参数中,-I表示编译包含的额外目录,-LD表示产生dll,-Fe后面表示产生dll的名字,具体的参数可以自己用cl -help命令查看。

如果成功编译,会产生hellodll.dll,hellodll.lib,hellodll.exp三个文件,将hellodll.dll考到工程根目录下。

6,运行java程序,输出Hello world !

参考来源:http://xiaomao870311.blog.51cto.com/1458701/545717
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

eclipse下JNI的初步实现 的相关文章

  • Java ZIP - 如何解压缩文件夹?

    是否有任何示例代码 如何将 ZIP 中的文件夹部分解压到我想要的目录中 我已将文件夹 FOLDER 中的所有文件读取到字节数组中 如何从其文件结构创建 我不确定你所说的部分是什么意思 您的意思是在没有 API 帮助的情况下自己完成吗 如果您
  • 通过拖动块来选择多个项目

    首先 让我告诉你 我对此感到压力很大 因为我什至不知道概念 方法名称 所以我什至无法在谷歌中搜索它 因为我不知道关键字 但我会尝试我的最好解释一下 请随意修改我的内容和标题 我想要实现的是 我的视图组包含许多子视图 或者它可以是 GridV
  • 在单独的模块中使用 Spring AOP 方面

    我在一个 Maven 项目模块中有一个方面 com x NiceAspect 在一个单独的 Maven 模块中有一个类 com x NiceClass 这些模块具有相同的 POM 父级 共同创建一个项目 我想要实现的目标是拥有一个通用的方面
  • 带有可点击区域的 Android 图像

    我需要建议如何在 Android 下实现以下功能 我需要一个表示类似于图形 来自离散数学 的图像 具有顶点和边缘 我可以在其中单击每个顶点或边缘并触发不同的操作 请告诉我如何实现这一目标 也许与imagebuttons 或另一种表示此功能的
  • Android 改造参数化@Headers

    我正在使用 OAuth 每次发出请求时都需要将 OAuth 令牌放入标头中 我看到 Header注释 但是有没有办法让它参数化 以便我可以在运行时传入 这是概念 Header Authorization OAuth var api vers
  • 将 try catch finally 块放入另一个 finally 块中

    try catch finally try catch finally 上面的代码好不好 是的 你可以这样做 实际上 在处理想要正确关闭的流时 您甚至需要这样做 InputStream in try catch finally try in
  • 如何在 Google 地图中创建自定义地图?

    我正在尝试创建一个包含我家地图的 Google 地图应用程序 卧室 浴室 厨房等 使用 GPS 我会找到我现在在家里的位置 并尝试获取到我卧室的方向 步行距离 您可以使用Google的API来获取方向 我需要知道的是 如何添加我家的自定义地
  • Eclipse :: 在“打开资源”对话框中隐藏 .svn 文件

    是否可以在 Eclipse 的 打开资源 对话框 Ctrl Shift R 中隐藏 svn 文件 当你有数百个文件时 这是非常烦人的 Cheers 请尝试以下操作 项目 gt 属性 gt 资源 gt 资源过滤器 gt 添加 选择 排除全部
  • android中ScrollView中的图像

    在我的应用程序中 我想放置一个 png 文件 并且希望它在横向和纵向模式下都被视为滚动图像 请建议代码或示例 要使您的 Imageview 在高度不适合时滚动 您可以在 xml 中的 ScrollView 内添加一个 ImageView 并
  • 上传失败您应该使用 http 和 https 作为您的 Web 意图过滤器的方案

    上传失败 您应该使用 http 和 https 作为您的 Web 意图过滤器的方案 我在将免安装应用上传到 Play 商店时收到此错误 我在清单中声明了 http 和 https 的意图过滤器 如下所示
  • 为什么我们在同一台服务器上使用多个应用程序服务器实例

    我想这是有充分理由的 但我不明白为什么有时我们会在同一物理服务器上放置例如 5 个具有相同 Web 应用程序的实例 这与多处理器架构的优化有关吗 JVM 或其他允许的最大内存限制 嗯 过了很长一段时间我又看到这个问题了 一台机器上的多个 J
  • Java并发锁和条件的使用

    我可以用object wait object notify and synchronized blocks解决生产者消费者类型的问题 同时我可以使用locks and conditions from java util concurrent
  • 设置 LinearLayout 的最大宽度

    如何设置水平线的最大宽度LinearLayout 因此 如果内容较短 例如某些文本 布局会缩小 如果内容较长 则布局不会扩展超过某个最大宽度值 我更喜欢在 XML 级别执行此操作 这就是我所需要的超出了之前答案中的建议 https stac
  • 如何在非Spring的构造型类中使用@Autowired

    我想在此类中使用该存储库 但是当我放置像 Component 这样的构造型时 我从 IDE 收到错误 无法自动装配 未找到 身份验证 类型的 bean public class CustomMethodSecurityExpressionR
  • java.lang.OutOfMemoryError:尝试将 Java 对象转换为 Json 字符串时的 Java 堆空间

    我尝试将 csv 文件转换为 200K 对象的 Json 文件 其中对象代表 csv 中的 1 行 我在 32 位上安装了 Java 并且项目配置 VM 参数 Xmx1024m 但是我得到 Exception in thread main
  • OnSwipe 方法在 RecyclerView 中不起作用

    我正在开发一个用于播放音频文件的应用程序 创建了包含 2 个选项卡的选项卡布局 两者中都使用了片段RecyclerView两者都被使用 该片段名为LibraryFragment有这个RecycleView其物品在刷卡时必须传递给HomeFr
  • 如何在 Android 上设置 Google Drive API?

    我一直在尝试将 Google Drive 功能集成到我的应用程序中 但我无法使用任何内置功能 因此我相信我要么错过了一个步骤 要么做得不正确 我正在遵循官方的 Google 开发者指南 https developers google com
  • 无法查询 ContentResolver 以从 my_downloads 获取下载文件的名称,但在 all_downloads 中工作正常

    我的应用程序设置为激活一次具有扩展名的文件 myappdata被打开 它通过这个意图过滤器来实现这一点
  • Android,Volley请求,响应阻塞主线程

    使用 Volley 处理较大响应时会发生一些不好的事情 String url AppHelper DOMAIN service pages profile update json this infoTextView setText getS
  • 如何在不显示父活动的情况下将一个全屏对话框片段替换为另一个全屏对话框片段?

    我有一个使用单个自定义 DialogFragment 类的活动 它的外观是数据驱动的 因此不同的调用看起来可能相当不同 它是 全屏 即 setStyle DialogFragment STYLE NO FRAME android R sty

随机推荐

  • Linux驱动开发(应用程序如何调用驱动)

    1 添加读写接口 1 在应用代码中 2 在驱动代码中 2 应用和驱动之间的数据交换 1 copy from user 用来将数据从用户空间复制到内核空间 2 copy to user 用来将数据从内核空间复制到用户空间 3 write和re
  • DAPM之一:概述

    DAPM Dynamic Audio Power Management 对应结构体是snd soc dapm widget和snd soc dapm route 对应的操作函数是snd soc dapm new controls snd s
  • C++对象模型和this指针

    C 对象模型和this指针 成员变量和成员函数分开存储 在C 中 类内的成员变量和成员函数分开存储 只有非静态成员变量才属于类的对象上 include
  • 逐梦C++补遗篇之一:cout与cerr的区分

    逐梦C 补遗篇之一 cout与cerr的区分 1 从定义看区别 cout 标准输出流 带缓冲 默认输出目的地为屏幕 可以被重定向 cerr 标准错误输出 不带缓冲 输出目的地为屏幕 一般不被重定向 缓冲 带缓冲 就是系统会为你分配一个缓冲区
  • 精彩观点一览

    7月20日下午 大模型的发展路径论坛于北京成功举办 大模型的发展路径论坛作为2023中国互联网大会的分论坛之一 由中国互联网协会人工智能工作委员会承办 中国信通院云计算与大数据研究所 华为云大数据与AI业务协办 并得到阿里云 北京智源研究院
  • 理解什么是 JMM

    理解什么是 JMM 本文已收录至 GitHub https github com yifanzheng java notes Java 虚拟机是一个完整的计算机的一个模型 因此这个模型自然也包含一个内存模型 Java 内存模型 也就是说 J
  • 最短路算法——Dijkstra

    Dijkstra 在大多数最短路径问题中 Dijkstra 算法是最常用 效率最高的 它是一种 单源 最短路径算法 一次计算能得到从一个起点 s 到其他所有点的最短距离长度 最短路径的途径点 一 Dijkstra的算法思想 Dijkstra
  • Upload LABS Pass-6

    第六关在后端使用了黑名单 并过滤了大小写和点 但未过滤空格 我们使用代理抓包在后缀名中添加空格 即可绕过黑名单 准备一个 6 php 文件 内容为一句话木马 上传 6 php 文件 并开启代理 此处使用 Burp Suite 拦截请求 在文
  • python旋转矩阵_python将四元数变换为旋转矩阵

    import numpy as np from autolab core import RigidTransform 写上用四元数表示的orientation和xyz表示的position orientation y 0 697127881
  • java代码的四层结构

    一 util包 放共同类的包 整个项目中 可以共用的一些代码 例如 一些常用的字符串的非空验证 身份证或者电话号码的正则验证等等 1 JDBC类功能的封装 package util import java io IOException im
  • VsCode中修改/重置gitlab远程仓库地址

    A 更换git远程仓库地址 1 查看当前remotes git remote v 2 修改remotes git remote set url origin https github com test test git B 重置git远程仓
  • Spring Boot中单元测试数据库的切换策略

    问题缘起 单元测试默认情况下使用嵌入式数据库 例如H2 如果要切换为MySQL 直接移除H2驱动 在application properties yml 配置相应的连接信息 都不起作用 那该如何切换配置呢 单元测试数据库 在SpringBo
  • 如何给Python写注释

    给程序写注释是一个很好的习惯 提高程序的可读性 写注释是不可少的步骤 Python与其他语言一样提供了两种注释方法 单行注释和多行注释 单行注释 Python中使用 进行单行注释 这里是一个单行注释 print 翔宇亭IT乐园 www bi
  • ap忘记管理ip地址怎么办_路由器刷集客固件,低成本实现AC+AP组网

    某讯K2T路由器刷集客固件 可以作为无线AP使用 多个K2T实现无缝漫游功能 通过微AC或者ESXI安装集客AC可以实现对AP进行管理 低成本的实现AC AP组网 确定版本号140版本 158以上版本的需要拆机 操作步骤 第一步 开启tel
  • 2019中国城市排名出炉——2019新一线城市有没有你的家乡!?

    新一线城市研究所在上海发布 2019城市商业魅力排行榜 新一线城市研究所收集了170个主流消费品牌的商业门店数据 18家各领域头部互联网公司的用户行为数据和数据机构的城市大数据 对337个中国地级及以上城市进行了评估 排行榜沿用了上一年的五
  • java集合框架

    这图画的真洒脱 光一个stack就有很多可探索了
  • 那些年踩过的坑——服务器中文路径

    从11年学编程至今已有十个年头 其实有时候也很后悔选择这个专业 整日和电脑相偎相依 人的思维和沟通能力也趋向机器 和别人聊天也不知道怎么开口 算法的一个评定标准就是以最少的语句实现所需的功能 但和别人聊天则不能这样 太直接简单会让人变得无趣
  • 总结了9款Mac端超好用的免费开源软件,你还有更好的推荐吗?

    与Windows相比 Mac上的软件 不仅不稀缺 并且大多数都更加精致 还没有乱七八糟烦人的弹窗骚扰 所以 本期就为大家盘点盘点Mac上有超好用的免费开源神器 1 Tincta 官网 https codingfriends github i
  • glibc堆内存管理

    glibc堆内存管理 背景 应用出现SIGABRT crash 报错信息为 malloc invalid size unsorted 即是在应用调用malloc分配内存时出现异常导致的crash 管理结构 进程虚拟地址空间被划分为代码段 数
  • eclipse下JNI的初步实现

    eclipse下JNI的初步实现 JNI java native interface 为java应用程序提供调用本地方法的接口 The standard Java class library may not support the plat