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开发 

 

扫描二维码关注公众号,回复: 5297383 查看本文章



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

 


javap -s 生成方法签名 
CCallJava\app\build\intermediates\classes\debug>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

猜你喜欢

转载自www.cnblogs.com/nangongyibin/p/10425289.html
今日推荐