JNT

Maya制作卡通眨眼眼皮绑定技巧 因为我们的控制器是约束在JNT01这个骨骼上的。也就意味着这根骨骼的旋转需要带动着后面的三根骨骼一起旋转。按照逻辑,假设眨眼是一件相当快速和简单的事情,可以用两种不同的形状来设置,一种是睁开眼皮,另一种是闭上眼皮。本文将通过一个表达式的运用,使最前面一根骨骼旋转时,带动后面的骨骼一起旋转,从而达到逐渐覆盖眼球的效果。这组表达式的意思就是BCD.rotate的值取决于A.rotate的值乘以不同的百分比的值。要理解的是,这个做的目的是在空值之间建立一种关系,因此当你移动末端的一个控制时,其他空值将自动收缩。 阅读详情
JNI是Java Native Interface的缩写。从Java 1.1开始,Java Native Interface (JNI)标准成为java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI一开始是为了本地已编译语言,尤其是C和C++而设计的,但是它并不妨碍你使用其他语言,只要调用约定受支持就可以了。
     使用java与本地已编译的代码交互,通常会丧失平台可移植性。但是,有些情况下这样做是可以接受的,甚至是必须的,比如,使用一些旧的库,与硬件、操作系统进行交互,或者为了提高程序的性能。JNI标准至少保证本地代码能工作在任何Java 虚拟机实现下。

一、JNI(Java Native Interface)的设计目的
     ·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

二、JNI(Java Native Interface)的书写步骤
     ·编写带有native声明的方法的java类
     ·使用javac命令编译所编写的java类
     ·使用javah ?jni java类名生成扩展名为h的头文件
     ·使用C/C++实现本地方法
     ·将C/C++编写的文件生成动态连接库
     ·ok

1) 编写java程序:这里以HelloWorld为例。
代码1:
class HelloWorld {
     public native void displayHelloWorld();
     static {
        System.loadLibrary("hello");
     } 
     public static void main(String[] args) {
         new HelloWorld().displayHelloWorld();
     }
}
声明native方法:如果你想将一个方法做为一个本地方法的话,那么你就必须声明改方法为native的,并且不能实现。其中方法的参数和返回值在后面讲述。 Load动态库:System.loadLibrary("hello");加载动态库(我们可以这样理解:我们的方法 displayHelloWorld()没有实现,但是我们在下面就直接使用了,所以必须在使用之前对它进行初始化)这里一般是以static块进行加载的。同时需要注意的是System.loadLibrary();的参数“hello”是动态库的名字。
2) 编译没有什么好说的了 javac HelloWorld.java
3) 生成扩展名为h的头文件 javah ?jni HelloWorld 头文件的内容: /* DO NOT EDIT THIS FILE - it is machine generated */

   1. include

/* Header for class HelloWorld */

   1. ifndef _Included_HelloWorld
   2. define _Included_HelloWorld
   3. ifdef __cplusplus

extern "C" {

   1. endif

/*

    * Class: HelloWorld
    * Method: displayHelloWorld
    * Signature: ()V
    * /

JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld (JNIEnv *, jobject);

   1. ifdef __cplusplus

}

   1. endif
   2. endif

(这里我们可以这样理解:这个h文件相当于我们在java里面的接口,这里声明了一个 Java_HelloWorld_displayHelloWorld (JNIEnv *, jobject);方法,然后在我们的本地方法里面实现这个方法,也就是说我们在编写C/C++程序的时候所使用的方法名必须和这里的一致)。

4) 编写本地方法实现和由javah命令生成的头文件里面声明的方法名相同的方法。
代码2:
1 #include
2 #include "HelloWorld.h"
3 #include
4 JNIEXPORT void JNICALL Java_HelloWorld_displayHelloWorld(JNIEnv *env, jobject obj) { printf("Hello world!/n"); return; }
注意代码2中的第1行,需要将jni.h(该文件可以在%JAVA_HOME%/include文件夹下面找到)文件引入,因为在程序中的JNIEnv、 jobject等类型都是在该头文件中定义的;另外在第2行需要将HelloWorld.h头文件引入(我是这么理解的:相当于我们在编写java程序的时候,实现一个接口的话需要声明才可以,这里就是将HelloWorld.h头文件里面声明的方法加以实现。当然不一定是这样)。然后保存为 HelloWorldImpl.c就ok了。

5) 生成动态库这里以在Windows中为例,需要生成dll文件。在保存HelloWorldImpl.c文件夹下面,使用VC的编译器cl成。 cl -I%java_home%/include -I%java_home%/include/win32 -LD HelloWorldImp.c -Fehello.dll 注意:生成的dll文件名在选项-Fe后面配置,这里是hello,因为在HelloWorld.java文件中我们loadLibary的时候使用的名字是hello。当然这里修改之后那里也需要修改。另外需要将-I%java_home%/include -I%java_home%/include/win32参数加上,因为在第四步里面编写本地方法的时候引入了jni.h文件。

6) 运行程序 java HelloWorld就ok.


三、JNI(Java Native Interface)的简要使用例子

     下面是一个简单的例子实现打印一句话的功能,但是用的c的printf最终实现。一般提供给java的jni接口包括一个so文件(封装了c函数的实现)和一个java文件(需要调用path的类)。

     1. JNI的目的是使java方法中能够调用c实现的一些函数,比如以下的java类,就需要调用一个本地函数testjni(一般声明为private native类型),首先需要创建文件weiqiong.java,内容如下:

class weiqiong { static { System.loadLibrary("testjni");//载入静态库,test函数在其中实现 } private native void testjni(); //声明本地调用 public void test() { testjni(); } public static void main(String args[]) { weiqiong haha = new weiqiong(); haha.test(); } }

     2.然后执行javac weiqiong.java,如果没有报错,会生成一个weiqiong.class。

     3.然后执行javah weiqiong,会生成一个文件weiqiong.h文件,其中有一个函数的声明如下:

JNIEXPORT void JNICALL Java_weiqiong_testjni (JNIEnv *, jobject);

     4.创建文件testjni.c将上面那个函数实现,内容如下:

   1. include
   2. include

JNIEXPORT void JNICALL Java_weiqiong_testjni (JNIEnv *env, jobject obj) { printf("haha---------go into c!!!/n"); }

     5.为了生成.so文件,创建makefile文件如下:

libtestjni.so:testjni.o makefile gcc -Wall -rdynamic -shared -o libtestjni.so testjni.o testjni.o:testjni.c weiqiong.h gcc -Wall -c testjni.c -I./ -I/usr/java/j2sdk1.4.0/include -I/usr/java/j2sdk1.4.0/include/linux cl: rm -rf *.o *.so 注意:gcc前面是tab空,j2sdk的目录根据自己装的j2sdk的具体版本来写,生成的so文件的名字必须是loadLibrary的参数名前加“lib”。

     6.export LD_LIBRARY_PATH=.,由此设置library路径为当前目录,这样java文件才能找到so文件。一般的做法是将so文件copy到本机的LD_LIBRARY_PATH目录下。

     7.执行java weiqiong,打印出结果:“haha---------go into c!!!”

四.JNI(Java Native Interface)调用中考虑的问题

     在首次使用JNI的时候有些疑问,后来在使用中一一解决,下面就是这些问题的备忘:
     1。 java和c是如何互通的?
     其实不能互通的原因主要是数据类型的问题,jni解决了这个问题,例如那个c文件中的jstring数据类型就是java传入的String对象,经过jni函数的转化就能成为c的char*。
     对应数据类型关系如下表:
Java 类型 本地c类型 说明 boolean jboolean 无符号,8 位 byte jbyte 无符号,8 位 char jchar 无符号,16 位 short jshort 有符号,16 位 int jint 有符号,32 位 long jlong 有符号,64 位 float jfloat 32 位 double jdouble 64 位 void void N/A

     JNI 还包含了很多对应于不同 Java 对象的引用类型如下图:


     2. 如何将java传入的String参数转换为c的char*,然后使用?

java传入的String参数,在c文件中被jni转换为jstring的数据类型,在c文件中声明char* test,然后test = (char*)(*env)->GetStringUTFChars(env, jstring, NULL);注意:test使用完后,通知虚拟机平台相关代码无需再访问:(*env)->ReleaseStringUTFChars(env, jstring, test);

     3. 将c中获取的一个char*的buffer传递给java?

这个char*如果是一般的字符串的话,作为string传回去就可以了。如果是含有’/0’的buffer,最好作为bytearray传出,因为可以制定copy的length,如果copy到string,可能到’/0’就截断了。

     有两种方式传递得到的数据:
     一种是在jni中直接new一个byte数组,然后调用函数(*env)->SetByteArrayRegion(env, bytearray, 0, len, buffer);将buffer的值copy到bytearray中,函数直接return bytearray就可以了。
     一种是return错误号,数据作为参数传出,但是java的基本数据类型是传值,对象是传递的引用,所以将这个需要传出的byte数组用某个类包一下,如下:

class RetObj { public byte[] bytearray; } 这个对象作为函数的参数retobj传出,通过如下函数将retobj中的byte数组赋值便于传出。代码如下: jclass cls; jfieldID fid; jbyteArray bytearray; bytearray = (*env)->NewByteArray(env,len); (*env)->SetByteArrayRegion(env, bytearray, 0, len, buffer); cls = (*env)->GetObjectClass(env, retobj); fid = (*env)->GetFieldID(env, cls, "retbytes", "[B"]); (*env)->SetObjectField(env, retobj, fid, bytearray);

     4. 不知道占用多少空间的buffer,如何传递出去呢?
     在jni的c文件中new出空间,传递出去。java的数据不初始化,指向传递出去的空间即可。

五.JNI中对JAVA传入数据的处理
     1. 如果传入的是bytearray的话,作如下处理得到buffer:
char *tmpdata = (char*)(*env)->GetByteArrayElements(env, bytearray, NULL); (*env)->ReleaseByteArrayElements(env, bytearray, tmpdata, 0); 
JNT技术手册(中文版) 所有可以找到的JNI技术的详细介绍(中英文),英语一般的同学可以参考! 立即下载

相关推荐

给新人的储能系统入门图解:从电芯到EMS,一张图看懂BESS里那些‘黑话’

本文通过视觉化拆解储能系统,从电芯到EMS详细解析BESS中的关键组件和行业术语。涵盖电芯参数、模组组装、PCS功能、BMS与EMS分工,以及SOC、DOD等关键运维参数,帮助新人快速理解储能系统的核心技术和应用场景。

weixin_42522964的博客 592

[问题记录]JNI的整型数组返回出现stack corruption

记录遇到的一点小问题和分析,本人水平有限,如有错误请多指教。

BlackRabbit_的博客 505

基于单片机的继电器参数测试系统设计

由于原有测试系统在参数设置上过于单一,在对继电器测试过程中需要多次进行器件连接,导致对其测试准确度下降,会造成继电器的二次损伤,基于单片机研究继电器参数测试系统的设计方法。在硬件设计上,构建二级模式集散控制框架,利用单片机进行数据采集和处理,满足实时继电器参数数据的同步控制;设计双极性反向比例输出电路,分别利用电极电阻对继电器两侧电压进行放大,实现继电器实时电压的检测。实验结果:以两组类型断电器为测试对象,分别连接示波器进行真实数据采集,在本文系统的应用下所得参数测试结果,与真实的数据相一致,具有实际应用效

weixin_45905610的博客 1438

AttributeError: ‘mujoco._structs.MjModel‘ object has no attribute ‘jnt_actgravcomp‘

或其他与 MuJoCo 集成的库)有关,可以尝试更新这些库到最新版本。该类相关问题部分与依赖库(如 dm_control。

qq_57532970的博客 715

告别ROS1!在Ubuntu 22.04上为VINS-Fusion适配ROS2 Humble的完整踩坑记录

本文详细记录了在Ubuntu 22.04上将VINS-Fusion从ROS1迁移到ROS2 Humble的完整过程,包括环境搭建、依赖管理、核心代码适配及性能优化。通过实战案例和调试技巧,帮助开发者高效解决迁移过程中的常见问题,提升系统稳定性和性能。

weixin_42628688的博客 280

「JS逆向三百例」JS逆向HIKVISION-视频监控的前端密码加密

本文详细分析了HIKVISION-海康威视监控前端登录过程中密码的加密机制,通过逆向工程解析了其 JavaScript 加密逻辑,重点研究了HIKVISION-海康威视监控的前端密码SHA256加密算法的实现。基于逆向分析结果,使用 Python 模拟了HIKVISION-海康威视监控的登录流程,最终实现了自动化登录功能。本文旨在为安全研究人员提供技术参考,帮助理解前端加密机制,并强调技术研究的合法性和合规性。

布啦啦 1095

java jnt_JNTA

The Bouncy Castle Crypto Package For JavaThe Bouncy Castle Crypto package is a Java implementation of cryptographic algorithms, it was developed by the Legion of the Bouncy Castle, a registered Austra...

weixin_30827827的博客 355

Dify知识库文档批量下载神器:一键导出所有文件到本地

在使用Dify进行知识库管理的过程中,我们经常遇到一个实际问题:如何将已上传到知识库中的文档批量下载到本地?目前Dify的管理界面虽然功能强大,但暂时没有提供直接的UI界面来批量导出或下载知识库内的文档。这意味着如果我们需要将知识库中的文件备份到本地或进行离线处理,只能通过API接口来实现。本文将详细介绍如何利用Dify的REST API构建一个完整的知识库文档下载解决方案,这也是目前实现知识库文件批量下载到本地的唯一可行路径。🎉进入大模型应用与实战专栏 | 🚀查看更多专栏内容首先,我们需要在Dify的

羊城迷鹿的博客 3473

jmp、JE、JZ、JNE、JNT指令

JMP 指令无条件跳转到目标地址,该地址用代码标号来标识,并被汇编器转换为偏移量 格式: JMP destination 当 CPU 执行一个无条件转移时,目标地址的偏移量被送入指令指针寄存器,从而导致迈从新地址开始继续执行。 JMP 指令提供了一种简单的方法来创建循环,即跳转到循环开始时的标号: top: . . jmp top ;不断地循环 JMP 是无条件...

qq_41683305的博客 5万+

【AIGC】大模型面试高频考点07-注意力(Attention)篇

AIGC面试高频考点

一个内容严谨、方向前沿、极具实践价值的AI大模型技术分享站 3361

2️⃣ Coze创建智能体教学(2025年全新版本)

扣子平台提供强大支持,可将智能体轻松集成至各类社交平台,使智能体得以服务更为庞大的用户群体。当下支持集成的平台如下:​1️⃣豆包:作为聚焦 AI 内容创作的平台,非常适合发布充满创意、娱乐性强的智能体。​2️⃣飞书:适合发布用于办公协作的智能体,助力团队提升工作效率。​3️⃣微信:借助公众号或小程序的形式,能够服务海量微信用户。​4️⃣抖音:适合发布与短视频相关的智能体,为用户提供创意与娱乐服务。​

李同学Lino的博客 4574

java jnt_java问题

importjava.awt.Image;importjavax.swing.*;publicclassIconButtonextendsJButton{//定义图标privateImageIconicon;IconButton(Stringimg){icon=newImageIcon(img);this.setIcon(icon...import java.awt.Image;import ja...

weixin_39775106的博客 358

MFC实现图书管理系统(附完整源码)

MFC实现图书管理系统(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 799

myeclipse svn JavaHL(JNT) 不能使用的问题?

分析:根据官方文档描述,64位的myeclipse 需要安装一个Subversion文件,否则会出现 not JavaHL(JNT),需要安装才能使用svn. 解决方案1:安装一个Setup-Subversion-1.7.10 链接:https://share.weiyun.com/e7c74499a8dd285cd284484a0a42aa57 (密码:zhW0) 解决方案2:可...

aojue6659的博客 276

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

java jnt_linux环境java中如何调用so文件-JNT实例.docx

Linux平台Java调用so库-JNI使用例子JNI例子一:1.确保gcc编译器已安装2.编写HelloJNI.java代码,用native声明需要用C实现的函数。如果源程序是包含在package里的话,应该建立同样的文件夹结构,比如/home/swan/test/net/wangliping/HelloJNI.javapackage net.wanglipingpublic class Hel...

weixin_35933582的博客 276

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

【项目评析】Jibrel Network(JNT)--去中心化银行???(黑人问号)

在我们讨论去中心化的时候,我们在讨论什么?   “在一个分布有众多节点的系统中,每个节点都具有高度自治的特征。节点之间彼此可以自由连接,形成新的连接单元。任何一个节点都可能成为阶段性的中心,但不具备强制性的中心控制功能。节点与节点之间的影响,会通过网络而形成非线性因果关系。这种开放式、扁平化、平等性的系统现象或结构,我们称之为去中心化。”这是一段对去中心化思维的概述。  

陀螺财经 1752

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

YJ_Load_Jnt_YYY

from maya.cmds import* def YJ_Load_Star_End_Jnt(): SelList = ls(sl=1) if len(SelList) == 0: error( "No Select Obj" ) else: Star = SelList[0] End = SelList[-1]

陈刚编程心得与知识集 668

微软日记本功能格式漏洞过多 微软补丁彻底删除该应用

由于在Windows日记本中最新的严重漏洞,微软在上月推送KB3161102补丁后就砍掉了XP就有的日记本功能,许多Windows系统用户已经彻底告别了日记本功能。到底是什么漏洞让微软下决心彻底停用如此经典的自带应用呢?据Softpedia报道,是最新的由安全专家Honggang Ren报告的内存堆溢出(Heap overflow).JNT文件特有漏洞令...

weixin_34417183的博客 208

MuJoCo中关节自由度地址与加速度数据访问解析

在物理仿真引擎MuJoCo中,开发者经常需要访问模型的各种状态数据,包括位置(qpos)、速度(qvel)和加速度(qacc)。本文深入探讨如何正确访问关节的加速度数据,特别是关于`MjModel.jnt_dofadr`字段的使用方法。 ## 关节自由度地址的概念 MuJoCo中的`jnt_dofadr`字段表示关节自由度的起始地址。这个地址在模型数据结构中扮演着重要角色,它确定了特定关节在状...

gitblog_00924的博客 394

UE4 如何旋转模型骨骼

由于模型是一整个,想单独旋转枪口位置在蓝图是不能做到的,我们找到骨骼。最后在蓝图内不断更新Actor的位置,这样就做成了枪口不断指向玩家了。在更新动画节点上对旋转角度进行更新,在此声明Location节点。在动画蓝图内部把控制的骨骼改成Turrent_jnt。并在动画蓝图里给它一个变量来控制骨骼旋转的角度。发现旋转该骨骼是能够旋转枪口的。

qqQQqsadfj的博客 2615

C++使用通配符查找文件(FindFirstFile)

调用 FindFirstFile 和 FindNextFile 可搜索某个目录下的相应文件。 BOOL SearchFilesByWildcard(WCHAR *wildcardPath) { HANDLE hFile = INVALID_HANDLE_VALUE; WIN32_FIND_DATA pNextInfo; hFile = FindFirst...

aiq8620的博客 1286

hadoop搭建时为什么最好重新编译源码的原因

一般hadoop需要在自己的linux环境下重新将源代码编译一下,为什么hadoop要自己再次编译一下,网上很多都是说:官网提供编译好的只有32位的,没有提供64位的,其实这种解释是错的。官网可下载的也有编译好的64位。 那为什么要大费周折的重新编译?主要是要重新编译本地库(Native Libraries) 代码(Linux下对应[.so]文件,window下对应[.dlI]文件),也就是编译

casion 9107

mysql部署练习_MySQL主从练习 - osc_b9r67jnt的个人空间 - OSCHINA - 中文开源技术交流社区...

1.按照1核CPU、4G内存、40G硬盘创建两台名为node-1和node-2的云主机。2.在公有云中完成一个名为intnetX的内部网络为192.168.X.0的云主机网络区域配置,将该网络网关设为192.168.X.201,使得node-1和node-2接入内部网络,并使云主机可以正常接入公共外部网络。3.创建一个80G的文件块存储disk-1,并将云硬盘格式化为EXT4格式,挂载到node-...

weixin_39645343的博客 202

【转】大数据【七十九】hadoop搭建时为什么最好重新编译源码的原因

一般hadoop需要在自己的linux环境下重新将源代码编译一下,为什么hadoop要自己再次编译一下,网上很多都是说:官网提供编译好的只有32位的,没有提供64位的,其实这种解释是错的。官网可下载的也有编译好的64位。 1。那为什么要大费周折的重新编译? 主要是要重新编译本地库(Native Libraries) 代码(Linux下对应[.so]文件,window下对应[.dlI]文件...

sunshine77_的博客 466

Windows 日志本

[code="java"] 微软今天向Windows 7/8.1/10系统推送了一个更新补丁KB3161102,但不是为了修复漏洞、更新功能,而是做减法:砍掉了自Windows XP Tablet PC Edition引入的日记本(Windows Journal)。   Windows日记本类似手机上的便签,当年是为了配合Windows XP平板机而诞生的,支持手写,此后在各个系统中都保留...

jis117的专栏 470
上一篇: 五十条经典的做人哲学
下一篇: 日语语法
Co_Creating
博客等级 码龄19年 5粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值