转战Android之NDK(jni, java调用c/c++)

java调用c/c++过程

1. 已采用ndk编译出c/c++库(c_libname.a/ c_libname so),根据c_libname.h编写对应的java类;
2. 根据native java类,编译出对应的cpp文件头;如下面例子:
    a) 使用Java工具Javah可以很容易地创建它而不用手动去创建。你对Java的class文件使用javah命令,就会为你生成一个对应的C/C++头文件。
    b) 设置好javah的环境变量,见2.1_3,打开控制台,输入 cd /d {android_project_path};
    输入javah -classpath .\src –jni {package_name}.{java_class_name};
    将生成jni头文件名为{package_name}_{java_class_name}.h 到控制台的当前显示路径下。
    javac命令:javac {java_file_path}\{java_class_name}.java,编译出*.classes
    javah命令:javah -classpath {android_project_path}\bin\classes -jni {package_name}.{java_class_name};
3. 根据生成的jni.h,实现相应的jni接口即可;
4. 接着就是library的编译了,将其编译为*.so动态库;
5. 最后Java中调用system.load 动态库后,并使用相应的native java类即可完成对c/c++调用。
    a) 生成的jni对应的C/C++实现等,这里称之为本地文件/方法/类型;java类函数返回值和参数类型根据等价约定映射到本地C/C++类型,如表2-1所示:
注意:所有的本地方法的第一个参数都是指向JNIEnv结构的。这个结构是用来调用JNI函数的。第二个参数jclass的意义,要看方法是不是静态的(static)或者实例(Instance)的。前者,jclass代表一个类对象的引用,而后者是被调用的方法所属对象的引用。

2‑1 JNI类型映射

Java类型

本地类型(jni)

描述

boolean

jboolean

C/C++8位整型

byte

jbyte

C/C++带符号的8位整型

char

jchar

C/C++无符号的16位整型

short

jshort

C/C++带符号的16位整型

int

jint

C/C++带符号的32位整型

long

jlong

C/C++带符号的64位整型e

float

jfloat

C/C++32位浮点型

double

jdouble

C/C++64位浮点型

Object

jobject

任何Java对象,或者没有对应java类型的对象

Class

jclass

Class对象

String

jstring

字符串对象

Object[]

jobjectArray

任何对象的数组

boolean[]

jbooleanArray

布尔型数组

byte[]

jbyteArray

比特型数组

char[]

jcharArray

字符型数组

short[]

jshortArray

短整型数组

int[]

jintArray

整型数组

long[]

jlongArray

长整型数组

float[]

jfloatArray

浮点型数组

double[]

jdoubleArray

双浮点型数组

       b)  JNI通过JNIEnv提供的操作Java数组的功能。它提供了两个函数:一个是操作java的简单型数组的,另一个是操作对象类型数组的。

          b1.简单类型的数组,使用GetXXXArrayElements函数(2-2)XXX代表了数组的类型

2‑2 JNI数组存取函数

函数

Java数组类型

本地类型

GetBooleanArrayElements

jbooleanArray

jboolean

GetByteArrayElements

jbyteArray

jbyte

GetCharArrayElements

jcharArray

jchar

GetShortArrayElements

jshortArray

jshort

GetIntArrayElements

jintArray

jint

GetLongArrayElements

jlongArray

jlong

GetFloatArrayElements

jfloatArray

jfloat

GetDoubleArrayElements

jdoubleArray

jdouble

          b2.操作对象类型,JNI通过ID识别域和方法,一个域或方法的ID是任何处理域和方法的函数的必须参数。

          表2-3列出了用以得到静态(static)和实例(instance)的域与方法的JNI函数。每个函数接受(作为参数)域或方法的类,它们的名称,符号和它们对应返回的jfieldIDjmethodID

2‑3 域和方法的函数

函数

描述

GetFieldID

得到一个实例的域的ID

GetStaticFieldID

得到一个静态的域的ID

GetMethodID

得到一个实例的方法的ID

GetStaticMethodID

得到一个静态方法的ID

      如果你有了一个类的实例,它就可以通过方法GetObjectClass得到,或者如果你没有这个类的实例,可以通过FindClass得到。符号是从域的类型或者方法的参数,返回值得到字符串,如表2-4所示。

2‑4 确定域和方法的符号

Java 类型

符号

boolean

Z

byte

B

char

C

short

S

int

I

long

L

float

F

double

D

void

V

objects对象

Lfully-qualified-class-name;L类名

Arrays数组

[array-type [数组类型

methods方法

(argument-types)return-type(参数类型)返回类型

 

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值