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流程的主要内容,如果未能解决你的问题,请参考以下文章