NDK开发(三)--JNI开发流程

一、编写流程

  • 1、声明native方法

  • 2、生成对应的头文件

使用javah命令

  • 3、在C/C++文件,引入对应的头文件,并实现对应的方法

使用""而非<>的方式引入。否则会报以下异常.

error: 'com_canter_ndkdemo3_JNIMethod.h' file not found with <angled> include; use "quotes" instead

如果不知道方法签名,可以使用 javas -p命令打印输出。-w484
C/C++代码的整体实现流程如下:

找到对应的类–>找到对应的方法–>调用相关的方法–>释放相关的资源–>应用程序进行调用。

二、静态方法调用

在 native 层调用 Java 层的静态方法。还有调用Java层的静态变量,并更改它的值。

JNIEXPORT void JNICALL Java_com_canter_ndkdemo3_JNIMethod_callStaticMethod__I(JNIEnv *env, jclass jclass1, jint jint1) {
//找到对应的类,需要全路径。将"." 替换成 "/"
jclass clas_JNIMethod = env->FindClass("com/canter/ndkdemo3/JNIMethod");
if (clas_JNIMethod==NULL) {
    return;
}
//获取对应的方法,静态和实例方法调用的是不同的api
jmethodID method_StaticMethodId =  env->GetStaticMethodID(clas_JNIMethod, "staticMethod","(Ljava/lang/String;)V");
if (method_StaticMethodId == NULL) {
    return;
}
jstring data = env->NewStringUTF(" call static method");
if (data == NULL) {
    return;
}
//调用相关方法
env->CallStaticVoidMethod(clas_JNIMethod, method_StaticMethodId, data);
//调用静态变量
jfieldID  jfieldID1 = env->GetStaticFieldID(jclass1, "sData", "Ljava/lang/String;");
if (jfieldID1 == NULL) {
   return;
}
jstring  jstring1 = env->NewStringUTF("native-lib");
//更改值
env->SetStaticObjectField(jclass1, jfieldID1, jstring1);
env->CallStaticVoidMethod(clas_JNIMethod, method_StaticMethodId, data);
//释放相关的资源
env->DeleteLocalRef(clas_JNIMethod);
env->DeleteLocalRef(data);
env->DeleteLocalRef(jstring1);

}

运行结果:
-w306

三、实例方法调用

JNIEXPORT void JNICALL Java_com_canter_ndkdemo3_JNIMethod_callInstanceMethod__I
        (JNIEnv *env, jobject jobject1, jint jint1) {
    jclass clas_JNIMethod = env->FindClass("com/canter/ndkdemo3/JNIMethod");
if (clas_JNIMethod == NULL) {
    return;
}
//找到对应的构造方法
    jmethodID  construct_Method = env->GetMethodID(clas_JNIMethod, "<init>", "()V");
if (construct_Method == NULL) {
    return;
}
//创建对象
jobject jniMethodObj = env->NewObject(clas_JNIMethod, construct_Method, NULL);
if (jniMethodObj == NULL) {
    return;
}

//找到对应的实例
jfieldID  jfieldID1 = env->GetFieldID(clas_JNIMethod, "address", "Ljava/lang/String;");
    if (jfieldID1 == NULL) {
        return;
    }
jstring addressData = env->NewStringUTF("native call guangxi");
//修改对应的实例
env->SetObjectField(jniMethodObj, jfieldID1, addressData);
    
//找到对应的实例方法方法
jmethodID jmethodID1 = env->GetMethodID(clas_JNIMethod, "logAddress", "(Ljava/lang/String;)V");
if (jmethodID1 == NULL) {
    return;
}
jstring address = env->NewStringUTF("call instance method");
//调用对应的实例方法
env->CallVoidMethod(jniMethodObj, jmethodID1, address);
env->DeleteLocalRef(address);
env->DeleteLocalRef(addressData);

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值