Java中调用jni代码
Java代码:
| 1 | public native String getString(); | 
native关键字指定该方法是native方法
同时在Java代码中调用so库
| 1 2 3 |     static {         System.loadLibrary("hellojni");     } | 
jni代码
h头文件中
| 1 | #include <jni.h>    //引用jni头文件,JNI中定义的宏才能用 | 
将方法声明放到extern "C" {}的方法体内
- 函数名命名规则: Java_包名_类名_方法名, 其中包名中的"."用"_"替换
- JNIEnv* 指向JNI环境的指针, 通过它访问JNI提供的接口方法
- jobject 表示Java对象中的this
cpp文件中
include上面的h文件
JNI调用Java中的代码
先通过类名找到类, 然后根据方法名找到方法的ID, 然后就可以调用了;
以静态方法为例, 非静态需先构造类对象
- 找类: jclass jclass1=env->FindClass("类的签名");
- 找方法: jmethodID jmethodID1=env->GetStaticMethodID(jclass1,"方法名(Java中的方法名)","方法的签名");
- 调用: env->CallStaticVoidMethodA(jclass1,jmethodID1,"方法参数");
.h文件
| 1 2 3 4 5 6 7 8 9 10 |     #include <jni.h>     #include <string.h>     #include <stdio.h>     #ifndef TEXTJNI_ONE_H     #define TEXTJNI_ONE_H     extern "C" {     JNIEXPORT jstring     JNICALL Java_com_example_cold_textjni_MainActivity_getString(JNIEnv *env, jobject thiz);     };     #endif //TEXTJNI_ONE_H | 
.cpp文件
| 1 2 3 4 5 6 7 8 9 10 11 12 |     #include "One.h"     #include <stdio.h>     JNIEXPORT jstring JNICALL Java_com_example_cold_textjni_MainActivity_getString(JNIEnv* env,jobject thiz ){         //获取Java类,方法的代码         jclass  jclass1=env->FindClass("类的签名");         jmethodID jmethodID1=env->GetStaticMethodID(jclass1,"方法名(Java中的方法名)","方法的签名");         env->CallStaticVoidMethodA(jclass1,jmethodID1,"方法参数");         //返回值         return env->NewStringUTF("I'm comes from to Native Function!");     } | 
JNI的数据类型和类型签名
基本数据类型
| Java类型 | 本地类型 | 描述 | 
|---|---|---|
| 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 | 双浮点型数组 | 
签名
- 类的签名 "L+包名+类名+;", 将'.'替换成'/',例如String的签名就是Ljava/lang/Sring;,';'是存在的.
- 基本数据类型的签名
| Java类型 | 签名 | 
|---|---|
| boolean | Z | 
| byte | B | 
| char | C | 
| short | S | 
| int | I | 
| long | J | 
| float | F | 
| double | D | 
| void | V | 
- 对象的签名
 对象的签名就是它所属的类的签名
- 数组的签名
 "[+类型签名",int[]的签名为[I
 "n个[+类型签名",多维,int[][]的签名为[[I
- 方法的签名
 "(参数类型签名)+返回值类型签名"
 例如:void fun1(int i), 签名为(I)V
 
	
0 Comments