Android studio 简单方便的使用JNI调用c语言中的方法

今天尝试了在Android studio中调用JNI,历尽千辛万苦终于成功了。不说废话,只谈步骤:

第一步:在gradle.properties文件中添加  Android.useDeprecatedNdk = true


第二步:将鼠标光标移到你的项目上按f4,选中SDK Location,这一步的是添加NDK,一般来说在最下面的NDK location是没有的,点击旁边的下载就可以等他下载安装。



第三步:NDK环境配置(自行百度),配置成功后,如下图所示,只要不是提示“未知命令”就说明配置成功了


第四步:写一个native方法,等下要用到的,然后rebuild project在java目录下面就会有一个.h文件生成。


第五步:build的配置,注意这里的moduleName要和MainActivity里面的一致,这个是等下生成的so文件的名字


第六步:在main目录下新建jni目录,把第四步生成的.h文件剪切到这里来,同时也创建下面的一些文件

Android.mk代码如下:

LOCAL_PATH := $(call my-dir)   
include $(CLEAR_VARS)

LOCAL_MODULE    := JniTest   和build.gradle里面的一致
LOCAL_SRC_FILES := main.c    你需要调用的c文件

include $(BUILD_SHARED_LIBRARY)

Application.mk代码如下:

APP_CFLAGS += -Wno-error=format-security
APP_ABI := armeabi    规定只生成这样的文件

.h文件如下:红色字体改成自己的就可以,格式是:java_包名—类—方法名(注意:这个.h文件是自动生成的,我的自动生成的java的j是大写,但是出错了,改成小写就可以了,不行的话照着这个来吧)

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_example_jnic_MainActivity */

#ifndef _Included_com_example_jnic_MainActivity
#define _Included_com_example_jnic_MainActivity
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_example_jnic_MainActivity
 * Method:    getStringFromNative
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL  java_com_example_jnic_MainActivity_getStringFromNative (JNIEnv * env, jobject* obj){
 return (*env)->NewStringUTF(env,"终于可以了!");
}
#ifdef __cplusplus
}
#endif
#endif
.c文件如下:下面的红色地方开头必须大写,注意了。这里的方法是和.h里一样的(不行照着来)

#include "com_example_jnic_MainActivity.h"
JNIEXPORT jstring JNICALL  Java_com_example_jnic_MainActivity_getStringFromNative (JNIEnv * env, jobject obj){
 return (*env)->NewStringUTF(env,"终于可以了");
}
到这里准备工作做完了,接下来就是重点了:拿到我们的so文件,

第七步:生成so文件,到你的项目目录下,执行 ndk-build,就会出现下面的

然后在你的目录工程结构下就会出现一个Libs,如下图:


这个时候你在main目录下新建一个jniLibs文件夹,把lib下面的文件整个复制到jniLibs下面,这个时候编译运行就OK了,有一点需要特别注意,如果你想改变输出的值,你就的重新在生成so文件,覆盖之前jniLibs下面的,在编译运行,就会得到你想要的结果了。

以上是我的JNI学习过程,有什么问题或者指点,可以随时在下面评论或者私聊我,谢谢。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章