JNI开发Studio流程

Posted nangongyibin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JNI开发Studio流程相关的知识,希望对你有一定的参考价值。


ndk-build 
①声明native方法 
②模块的根目录下创建一个jni目录 
创建android.mk 
右键单击模块 
 技术图片

 


选择Link C++ Project with gradle 
 技术图片

 


这个Android.mk指定了之后就给当前的项目添加了ndk-build的支持

写C的代码 
③ java代码中 system.loadlibrary加载.so模块 
④直接运行项目 studio会帮助运行ndk-build 不需要自己到命令行运行

JNI调用流程说明 
 技术图片

 

 Cmake方式进行jni开发 

 技术图片

 



技术图片

cmakelists.txt文件 作用跟Android.mk是一样的 向编译系统描述要编译的资源

 技术图片

 


javap -s 生成方法签名 
CCallJavaappuildintermediatesclassesdebug>javap -s 要生成方法签名的类的全路径

向logcat输出日志: 
①Android.mk文件增加以下内容 
LOCAL_LDLIBS += -llog 
如果是CMake方式 studio帮助创建的CMakeLists.txt文件中已经加入了导入liblog的内容不需要特殊配置

②C代码中增加以下内容

#include <jni.h>
#include<stdio.h>
#include<stdlib.h>
#include <android/log.h>

#define LOG_TAG "System.out"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)

 

C代码中使用logcat, 例:

    LOGD("len = %d", len);

 

c调用java的流程

JNIEXPORT void JNICALL
Java_ngyb_jnijc_JNIJ_chello(JNIEnv *env, jobject instance) {
    jclass clazz = (*env)->FindClass(env, "ngyb/jnijc/JNIJ");
    jmethodID jmethodID1 = (*env)->GetMethodID(env, clazz, "helloFromJava", "()V");
    // TODO
    (*env)->CallVoidMethod(env, instance, jmethodID1);
}

JNIEXPORT void JNICALL
Java_ngyb_jnijc_JNIJ_cadd(JNIEnv *env, jobject instance) {
    jclass clazz = (*env)->FindClass(env, "ngyb/jnijc/JNIJ");
    jmethodID mthod = (*env)->GetMethodID(env, clazz, "add", "(II)I");
    int result = (*env)->CallIntMethod(env, instance, mthod, 3, 4);
    LOGD("result = %d", result);
    // TODO
}

JNIEXPORT void JNICALL
Java_ngyb_jnijc_JNIJ_cprintstring(JNIEnv *env, jobject instance) {
    jclass clazz = (*env)->FindClass(env, "ngyb/jnijc/JNIJ");
    jmethodID jmethodID1 = (*env)->GetMethodID(env, clazz, "printString", "(Ljava/lang/String;)V");
    jstring js = (*env)->NewStringUTF(env, "hello");
    (*env)->CallVoidMethod(env, instance, jmethodID1, js);
    // TODO
}

JNIEXPORT void JNICALL
Java_ngyb_jnijc_MainActivity_showtoast(JNIEnv *env, jobject instance) {
    jclass clazz = (*env)->FindClass(env, "ngyb/jnijc/MainActivity");
    jmethodID jmethodID1 = (*env)->GetMethodID(env, clazz, "showToast", "(Ljava/lang/String;)V");
    // jobject  obj = (*env)->AllocObject(env,clazz);
    jstring js = (*env)->NewStringUTF(env, "hello");
    (*env)->CallVoidMethod(env, instance, jmethodID1, js);
}

 

第三步需要注意 如果要调用的java方法和native方法不在一个类中需要创建对象,但是如果这个对象是Activity/Service四大组件 
不要自己创建对象 需要使用jni接口传递进来的参数jobject























以上是关于JNI开发Studio流程的主要内容,如果未能解决你的问题,请参考以下文章

在Android Studio中进行NDK开发的一般流程

靠谱Android Studio JNI Demo

Android Studio 开发JNI应用

jni开发初试

JNI/NDK开发指南—— JNI开发流程及HelloWorld

JNI开发的流程①