JNI (JAVA Native Interface) 是 Java 与 C 的桥梁,有些时候要用到 JNI :
•访问底层硬件
•提高代码运行效率
简单的整型数据传递
•首先添加环境变量:
◦jni.h include=C:\Program Files\Java\jdk1.6.0_13\include
◦jni_md.h include=C:\Program Files\Java\jdk1.6.0_13\include\win32
•用 eclipse 编写 Java 代码:D_int.java
Java代码
1.package com.ldq.d_int;
2.
3.public class D_int {
4. static {
5. System.loadLibrary("Factorial");
6. }
7.
8. public native long getFactorial(int num);
9.
10. public static void main(String[] args) {
11. D_int d = new D_int();
12. int num = 10;
13. System.out.println(num + "!=" + d.getFactorial(num));
14. }
15.
16.}
package com.ldq.d_int;
public class D_int {
static {
System.loadLibrary("Factorial");
}
public native long getFactorial(int num);
public static void main(String[] args) {
D_int d = new D_int();
int num = 10;
System.out.println(num + "!=" + d.getFactorial(num));
}
}
•在 bin 目录下,生成头文件 com_ldq_d_int_D_int.h:javah -jni com.ldq.d_int.D_int
C代码
1./* DO NOT EDIT THIS FILE - it is machine generated */
2.#include <jni.h>
3./* Header for class com_ldq_d_int_D_int */
4.
5.#ifndef _Included_com_ldq_d_int_D_int
6.#define _Included_com_ldq_d_int_D_int
7.#ifdef __cplusplus
8.extern "C" {
9.#endif
10./*
11. * Class: com_ldq_d_int_D_int
12. * Method: getFactorial
13. * Signature: (I)J
14. */
15.JNIEXPORT jlong JNICALL Java_com_ldq_d_1int_D_1int_getFactorial
16. (JNIEnv *, jobject, jint);
17.
18.#ifdef __cplusplus
19.}
20.#endif
21.#endif
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_ldq_d_int_D_int */
#ifndef _Included_com_ldq_d_int_D_int
#define _Included_com_ldq_d_int_D_int
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_ldq_d_int_D_int
* Method: getFactorial
* Signature: (I)J
*/
JNIEXPORT jlong JNICALL Java_com_ldq_d_1int_D_1int_getFactorial
(JNIEnv *, jobject, jint);
#ifdef __cplusplus
}
#endif
#endif
•在 bin 目录下新建 Factorial.cpp 文件,并根据上面函数定义,编写代码:
Cpp代码
1.#include "com_ldq_d_int_D_int.h"
2.
3.JNIEXPORT jlong JNICALL Java_com_ldq_d_1int_D_1int_getFactorial (JNIEnv *env, jobject obj, jint num)
4.{
5. int f=1;
6. for(int i=1;i<num+1;i++)
7. {
8. f*=i;
9. }
10. return f;
11.}
分享到:
相关推荐
- 字符串处理:Java字符串在本地代码中通常表示为jstring,需要使用GetStringUTFChars()和ReleaseStringUTFChars()进行转换。 5. 数据类型转换: JNI提供了多种数据类型,用于在Java和本地代码之间转换数据,例如...
5. **字符串和数组处理**:JNI提供接口来操作Java的字符串和数组,如`NewStringUTF`用于创建UTF-8编码的Java字符串,以及`GetArrayLength`和`GetPrimitiveArrayCritical`来获取数组长度和直接访问数组元素。...
� Android 的平台基本上是免费的,虽然有部份原生链接库会要求费用,但大部份是免权利金; Android 的 程序可以采用 JAVA 开发,但是因为它的虚拟机 (Virtual Machine) Dalvik ,是将 JAVA 的 bytecode 转成 自 己...
9. **类型转换**:Java支持基本类型的自动类型转换(小类型到大类型)和强制类型转换(大类型到小类型,需要显式操作)。例如,将`String`转换为`int`可以使用`Integer.parseInt()`。 10. **命令行参数**:Java程序...
而BASE64编码是一种字符编码方式,用于将二进制数据转换成ASCII字符串,便于在网络传输或存储时使用。 以下是使用NDK实现RSA加解密的基本步骤: 1. 在C/C++层编写RSA加密和解密的函数,调用OpenSSL库提供的API,如`...
- 如果字符串不是有效的整数格式,将会抛出NumberFormatException异常。 1.1.4 Shorts1=1; s1=s1+1;有什么错? Shorts1=1; s1+=1;有什么错? - Shorts1=1; s1=s1+1;在shorts1=1时会自动提升为int类型,然后执行加1...
首先,编写一个C/C++接口,如`executeFFmpegCmd`,接收命令字符串作为参数,并调用系统调用来执行FFmpeg命令。 2. 构造压缩命令:视频压缩的命令通常包括选择合适的编码器、设置比特率、分辨率等参数。例如: ``` ...
在处理数据类型时,如字符串(String),Java使用UTF-16编码,而C/C++通常使用UTF-8,因此在跨语言调用时需要进行编码转换,这增加了额外的开销。 此外,JNI调用还涉及到内存管理问题。由于Java有自动的垃圾收集...
例如,`jclass`用于表示Java类,`jobject`可以代表任何对象,`jstring`则代表字符串。 6. **数据类型转换**:JNI提供了函数来在Java数据类型和C/C++数据类型之间进行转换,如`jbooleanToBoolean()`, `GetIntField()...
Android应用中的资源文件包括图像、布局文件、字符串资源等。这些资源通常存储在应用的`res/`目录下。资源加载机制涉及以下几个关键方面: - **资源索引**:在Android应用打包过程中,所有资源都会被赋予一个唯一的...