当VM载入libmedia_jni.so档案时,就呼叫JNI_OnLoad()函数。接着,JNI_OnLoad()呼叫 register_android_media_MediaPlayer()函数。此时,就呼叫到 AndroidRuntime::registerNativeMethods()函数,向VM(即AndroidRuntime)登记gMethods[]表格所含的本地函数了。简而言之,registerNativeMethods()函数的用途有二:
1) 更有效率去找到函数。
2) 可在执行期间进行抽换。由于gMethods[]是一个<名称,函数指针>对照表,在程序执行时,可多次呼叫registerNativeMethods()函数来更换本地函数之指针,而达到弹性抽换本地函数之目的。
(4). Andoird 中使用了一种不同传统Java JNI的方式来定义其native的函数。其中很重要的区别是Andorid使用了一种Java 和 C 函数的映射表数组,并在其中描述了函数的参数和返回值。这个数组的类型是JNINativeMethod,定义如下:
typedef struct {
const char* name; /*Java中函数的名字*/
const char* signature; /*描述了函数的参数和返回值*/
void* fnPtr; /*函数指针,指向C函数*/
} JNINativeMethod;
其中比较难以理解的是第二个参数,例如 "()V" ,"(II)V", "(Ljava/lang/String;Ljava/lang/String;)V". 实际上这些字符是与函数的参数类型一一对应的。"()" 中的字符表示参数,后面的则代表返回值。例如"()V" 就表示void Func(); "(II)V" 表示 void Func(int, int);
具体的每一个字符的对应关系如下:
字符 Java类型 C类型
V void void
Z jboolean boolean
I jint int
J jlong long
D jdouble double
F jfloat float
B jbyte byte
C jchar char
S jshort short
数组则以"["开始,用两个字符表示
[I jintArray int[]
[F jfloatArray float[]
[B jbyteArray byte[]
[C jcharArray char[]
[S jshortArray short[]
[D jdoubleArray double[]
[J jlongArray long[]
[Z jbooleanArray boolean[]
上面的都是基本类型。如果Java函数的参数是class,则以"L"开头,以";"结尾,中间是用"/" 隔开的包及类名。而其对应的C函数名的参数则为jobject. 一个例外是String类,其对应的类为jstring
Ljava/lang/String; String jstring
Ljava/net/Socket; Socket jobject
如果JAVA函数位于一个嵌入类,则用$作为类名间的分隔符。
例如 "(Ljava/lang/String;Landroid/os/FileUtils$FileStatus;)Z"
分享到:
相关推荐
JNI是Java平台的一个特性,允许Java代码调用本地(非Java)代码,如C++或C代码。在本例中,我们通过JNI将NV12数据传递到C++层,以利用C++的高效处理能力。在C++层面,我们可以编写函数来解析NV12数据,将其转换为RGB...
在Android开发中,JNI通常用于实现性能敏感的代码、调用系统底层库或者利用硬件特性,例如图像处理、加密算法等。本教程将探讨在Android Studio中开发Eclipse NDK项目的流程,以及在编写过程中可能遇到的问题和解决...
JNI为Java程序员提供了一种方式,可以在Java代码中调用本地方法,反之亦然。它定义了一系列的函数,例如`FindClass`用于查找Java类,`GetMethodID`用于获取Java方法的ID,以及`CallXXXMethod`系列函数用于调用本地...
7. **调试和测试**:使用自定义JNI命名空间时,调试和测试可能需要额外的步骤,比如设置断点、查看本地变量和调用栈,以及确保正确的库加载顺序。 8. **性能优化**:在某些情况下,使用自定义命名空间可能有助于...
JNI在本案例中可能用于创建一个桥接,使得Java应用程序可以调用C或C++编写的底层串口通信库,这样可以充分利用C/C++的性能优势,同时保留Java的跨平台特性。JNI接口主要包括本地方法声明、本地方法实现、头文件生成...
在Android串口通信中,JNI被用来调用C/C++的底层库,这些库可以直接操作硬件,比如访问串口。通过JNI,我们可以编写高效的本地代码来处理串口I/O,然后在Java层调用这些函数,实现Android应用与串口设备的通信。 2....
在Android中,这通常在`onDrawFrame`方法中完成,通过JNI调用C代码进行渲染。 最后,别忘了清理资源。当不再需要OpenGL ES对象时,应使用`glDeleteBuffers`、`glDeleteProgram`等函数释放它们。 总的来说,通过...
7. **Java调用JNI**:在Java层,调用JNI接口方法,触发四边形的绘制。记得每次调用时都要检查OpenGL错误,以确保没有意外发生。 8. **同步原生代码和Java代码**:使用JNI函数,可以实现Java和C++之间的数据交换,...
JNA提供了一种无需编写JNI(Java Native Interface)代码就能直接调用本地库的方法,大大简化了Java与原生代码之间的通信。 标题“Jna-调用本地dll”意味着我们将探讨如何使用JNA来调用Windows上的DLL函数。DLL文件...
- **Java Native Interface**:Java平台允许开发者使用C/C++代码,通过JNI调用本地方法。在串口通信中,可以使用JNI编写底层驱动,提高效率和性能。 - **JNI与串口**:在JNI层,开发者可以直接调用操作系统提供的...
这些服务为整个系统提供了关键功能,是构建在Dalvik VM之上的组件,通过JNI调用底层的Linux内核功能。 - **android.app.Service**:这是开发者在应用程序中可以创建的服务组件,通常用于执行后台任务,如音乐播放、...
为了提高性能和利用底层C/C++库的优势,开发者常常采用JNI(Java Native Interface)技术。本篇文章将深入探讨如何使用Android JNI来实现对GIF 87a和89a格式的播放器。 首先,理解JNI是关键。JNI是Java平台提供的一...
- **JNI(Java Native Interface)**:通过编写C/C++代码,利用JNI接口调用Linux底层的串口操作函数,实现串口通信。 - **第三方库**:例如Android Serial Port Interface (ASPI)、USBSerial等,这些库封装了底层...
通过JNI在Android上实现匿名管道,开发者可以充分利用底层系统的特性,实现高效的进程间通信。不过,使用时需注意权限问题和线程同步,确保数据安全和程序稳定性。在实际项目中,根据具体需求选择合适的通信方式是至...
JNA是一种纯Java库,允许Java代码直接调用本地库(如C库)的功能,而无需编写JNI(Java Native Interface)代码。它通过映射C函数和结构到Java类型来实现这一目标。 在C语言中,结构体是数据组织的一种方式,可以...
Java Native Access 是一个开源项目,它允许Java程序无需JNI(Java Native Interface)就能调用本机库函数。JNA通过映射原生类型到Java类型,以及通过一个简单的接口定义,简化了Java调用原生代码的过程。JNA的使用...
- **实现**:在Java层,通过`javax.microedition.khronos.opengles`包提供OpenGL ES的API,这些API最终通过JNI调用底层OpenGL ES库来实现。 #### 六、输入事件处理流程 - **概述**:Android系统接收来自触摸屏、...
对于Eclipse RCP尚未提供的某些功能,可以利用JNI(Java Native Interface)技术直接调用底层操作系统的API来实现。这种方法虽然较为复杂,但在特定情况下能够实现高度定制化的界面效果。例如,可以使用JNI技术来...
Java Native Access(JNA)是Java平台上的一个开源库,它允许Java代码直接调用本机库函数,无需编写JNI(Java Native Interface)代码。JNA通过动态地映射本机函数到Java方法,简化了Java与C/C++、Windows API、Unix...
在给定的`JniDemo`项目中,可能涉及到Java Native Interface(JNI),这是一种允许Java代码调用C/C++代码的机制。JNI应用也可能利用`init_array`进行C/C++部分的初始化。例如,你可能需要在JNI库加载时初始化某些...