JNI用法总结
Java侧代码就不要说什么了, 很简单:
1.参数传递
参数如何从Java代码传递给C代码的,这里仅仅牵涉到几种基本类型:
jstring, jboolean, jobject,jint,jdouble, 比较简单
2.参数转化
传递过来j-参数,怎么像使用C代码一样使用?这里就有类型转化的问题。
a>基本类型可以直接使用, 如double和jdouble可以互用。
b> java对象使用
对象有String对象和通用的Object对象。 处理的方式有点不同。
不要再C/C++中调用Java的方法, C/C++处理完之后, 将数据对象传出就OK
b1>String对象
GetStringUTFChars取得从Java传入过来的String对象
ReleaseStringUTFChars 用完之后需要释放
b2>Object对象
先得到对象的类句柄:
jclass objectClass = (env)->FindClass("com/ostrichmyself/jni/Structure");
然后取该类中, 需要的域句柄:
jfieldID str = (env)->GetFieldID(objectClass,"nameString","Ljava/lang/String;");
jfieldID ival = (env)->GetFieldID(objectClass,"number","I");
传入的jobject对象, 直接对各个域赋值。
(env)->SetObjectField(theObjet,str,(env)->NewStringUTF("my name is D:"));
(env)->SetShortField(theObjet,ival,10);
如果没有传入对象,而是新生成对象,则可以通过
jobject myNewObjet = env->AllocObject(objectClass);
3.Java数组的处理
用GetObjectArrayElement取传入的数组
用NewObjectArray 构造一个数组
4.资源释放原则
a1>C/C++ new的对象或者Malloc的对象,当然要由C/C++去释放
a2>通过JNIEnv的方法new的对象, 如果不需要给Java使用,则必须释放
a3>通过GetStringUTFChars转化从Java得到的String对象到UTF,需要开辟内存,使用完Char*时,
务必释放内存,方法是:ReleaseStringUTFChars
基本涵盖了Java调用C++/C的语法,没有研究C调用Java,是觉得没有必要,c调用Java,说明对Java和C
的优势不清楚。
分享到:
相关推荐
另一个是`Apache POI`,虽然它是为Java设计的,但通过`JNA`(Java Native Access)或`JNI`(Java Native Interface)可以在C++中使用。 在"BasicExcel.cpp"文件中,我们可能会看到以下关键步骤: 1. **库的引入**...
首先,需要创建一个支持COM的DLL,这个DLL通常由C++或Visual Basic等支持COM的语言编写。然后,在PHP脚本中,可以使用`com_create_guid`函数生成一个唯一的类ID,接着使用`com_load`或`com_get_active_object`函数...
有关示例项目,请参见src/sbt-test/sbt-jni/basic 。安装resolvers + = Resolver .url( " joprice-sbt-plugins " , url( " http://dl.bintray.com/content/joprice/sbt-plugins " ))( Resolver .ivyStylePatterns)...
- JNI(Java Native Interface):Java与本地代码交互。 - 设计模式:单例、工厂、观察者、装饰者、适配器等常见设计模式的应用。 总的来说,这个"basicjava_pdf"的压缩包提供了从入门到进阶的全面Java学习资源,...
在实现BasicExcel库时,开发者可能会利用开源库如libxlsxwriter、libxl或者Apache POI(Java库,但可以通过JNI在C++中调用)来简化底层的文件操作。这些库已经处理了Excel文件的复杂格式,使得开发者可以专注于应用...
JDBC驱动通过JNI(Java Native Interface)调用oci.dll中的函数,实现与Oracle数据库的通信。 6. cx_Oracle.pyd:Python的Oracle数据库驱动,对应于cx_Oracle模块,允许Python开发者使用Python语言直接访问Oracle...
ISOBUS协议栈则是在CAN基础之上,定义了用于农业和工程设备的数据交换标准,包括基本服务(Basic Services, BS)、应用服务(Application Services, AS)和终端节点服务(Terminal Device Services, TDS)。...
"SCJP.basic1.rar_scjp"是一个压缩包文件,包含了针对SCJP认证的基础学习资料,适合对Java编程感兴趣或准备参加SCJP考试的学习者。 在"SCJP認證課程 基礎篇(一)"中,我们可以期待学习以下几个核心的Java知识点: 1...
OER是3GPP和其他组织推荐的一种更高效、节省空间的编码规则,相对于基本的BER(Basic Encoding Rules)和DER(Distinguished Encoding Rules),它更适合有限带宽和资源受限的环境。 接下来,JNI是Java平台的一部分...
除了调用C/C++的DLL,Java还可以通过Jacob库调用VB(Visual Basic)编写的DLL,即Com组件。Jacob是一个开源库,提供了一种简单的方法来从Java调用COM对象。 ##### 1. 准备Jacob库 下载Jacob的最新版本,通常包括`...
Jacob是一个Java和COM(Component Object Model)之间桥梁的开源库,它允许Java代码直接调用DLL和OCX控件,这些控件通常是由Visual Basic (VB)或Visual C++ (VC)等编程语言开发的。 **JNI基础** JNI是Java平台提供...
在GWT应用中,可能会通过Java Native Interface (JNI) 来调用这样的类,从而在JavaScript中使用Windows API。 2. `VB程序太平洋.EXE`: 这可能是一个Visual Basic编译后的可执行文件,可能是一个配套的示例程序,...
4. **Visual Basic (VB)**:VB6和.NET版本都有内置的加密和解密功能,但可能需要第三方库来处理硬件级别的加密狗。例如,可以使用ActiveX控件或.NET的CryptoAPI,通过编写VB代码来与加密狗通信。 5. **DELPHI**:...
开发者可以学习如何通过Java的JNI(Java Native Interface)或其他库来控制LED通讯卡。 通过这些示例,开发者可以了解如何使用不同的编程语言与视展LED通讯卡进行通信,实现对LED显示屏的控制,包括文本上传、动态...
此外,"NativeObject"涉及的是B4A的原生对象功能,它可以让你直接访问Android的JNI(Java Native Interface),实现更底层的系统调用,提高性能或者使用特定的硬件功能。 **五、源码分析** 提供的源码文件"Booklets...
本文将详细介绍如何利用不同编程语言进行海康工业相机的开发,包括VC(Visual C++)、VB(Visual Basic)、C#、VS(Visual Studio)、PYTHON、DELPHI、JAVA以及OPENCV和LABVIEW。 1. **VC(Visual C++)**:VC++ 是...
在命令行中输入`regsvr32 mscomm32.ocx`,这将注册MSComm控件,使其可在Visual Basic、Delphi等开发环境中使用。在Delphi中,可以通过Components->Install Component菜单选项,导入Active X Control,选择Microsoft ...
火车协议Java 这是由 Michel Simatic 设计的用于火车协议的 Java 接口。 它使用 JNI 从的调用本机函数(阅读)。... 但是,除了测试/集成中的 basicTest 之外,其他测试目前无法在 Mac OS X 上运行。
在Java中与GoDEX打印机通信,开发者可能需要用到Java的JNI(Java Native Interface)来调用C/C++编写的库,或者是Java的Socket编程来直接与打印机建立网络连接,实现数据传输。 VB,即Visual Basic,是微软的一种...