终于建了一个自己个人小站:https://huangtianyu.gitee.io,以后优先更新小站博客,欢迎进站,O(∩_∩)O~~
1. 简介
有时候我写了个Java层的方法,希望native层也能够调用(尤其是一个实体类的get,set方法在native一般都会用到)。这在jni开发中也很常见,jni.h中也提供了很多方法。下面利用具体实例进行说明。这里直接使用AS3.0里面的CMake进行编译了,之后会讲解下Android.mk和Application.mk的用法和含义。这里我主要介绍一下几个:
1. java向native传递常用基本数据类型和字符串类型
2. java向native传递数组类型
3. java向native传递自定义java对象
4. java向native传递List对象
5. native向java返回字符串类型
6. native向java返回java对象
7. native向java返回数组类型
8. native向Java返回List对象
对于上面的每个都给出对应的例子。
本节所有案例代码均已放到GitHub上,欢迎下载:
https://github.com/huangtianyu/JNILearnCourse
1.1 java和jni类型对照表
在我们调用方法时会用到方法的签名,使用类变量时需要用该变量对应的jni类型。下面给出对应的类型对照表。
1. 基本数据类型对照表:
2. 对象类型对照表:
3. 简写对应表
2. 具体例子
2.1 java向native传递常用基本数据类型和字符串类型
强大的AS在你写了java的native方法后,直接快捷键按Alt+Enter后即可生成对应的方法。
java层的方法:
package zqc.com.example;
public class NativeTest {
// Used to load the 'native-lib' library on application startup.
static {
System.loadLibrary("native-lib");
}
//定义一个native方法,然后传入基本数据类型和String型
public native void java2jniMethod1(boolean b, int i, float f, String s);
}
生成后的native方法:
extern "C"
JNIEXPORT void JNICALL
Java_zqc_com_example_NativeTest_java2jniMethod1(JNIEnv *env, jobject instance, jboolean b, jint i,
jfloat f, jstring s_) {
//在native层会把string转换成c/c++都特别熟悉的char*,由char*可以转string,wstring等等。
//在Java层String是对象,这里讲char*指针指向了该对象,在方法结束的时候记得要是否该指针引用
if (b == JNI_TRUE) {
LOGE("b is true");
} else {
LOGE("b is false");
}
float nativi = i + f;
LOGE("native i: %f", nativi);