jni在Android studio中的配置和使用(二)

来源:互联网 发布:vb.net和c#区别 编辑:程序博客网 时间:2024/06/03 21:45

上一篇我们讲述了通过ndkBuilder的方式,最后再补充一点.
如果你前面的操作都成功了,最后会在你该module的builde/intermediates/ndk/debug/lib目录下生成so库,这里写图片描述
你可以直接使用so库,效果是一样的
这里写图片描述
我这里已经把jni文件夹删掉,然后创建了一个jniLibs,把刚刚的so库拷过来,然后运行代码效果是一样的.(ps 使用全部编译,别用Instant Run,否则如果有问题是表现不出来的)

—-叫我分割线———————-

2.使用cmake进行项目的构建
– 1.首先在创建project的时候勾选Include c++ support(注意,是创建project,不是module)这里写图片描述
– 2.选择c/c++的标准这里写图片描述
上面的配置你也可以直接在你module的build.gradle的defaultConfig节点中设置,效果是一样

 externalNativeBuild {            cmake {                cppFlags "-frtti -fexceptions"                //cppFlags "-std=c++11"            }        }

– 3.在build.gradle中的android节点下面会增加配置,指定生成so文件配置文件的路径

externalNativeBuild {        cmake {            path "CMakeLists.txt"         }    }

– 4.创建需要调用C/C++代码的java代码,和ndkBuilder相同

public class JniUtils {    public static native String getString();}

– 5.编写你的c/c++代码

/* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* Header for class com_cmakedemo_utils_JniUtils */#ifndef _Included_com_cmakedemo_utils_JniUtils#define _Included_com_cmakedemo_utils_JniUtils#ifdef __cplusplusextern "C" {#endif/* * Class:     com_cmakedemo_utils_JniUtils * Method:    getString * Signature: ()Ljava/lang/String; */JNIEXPORT jstring JNICALL Java_com_cmakedemo_utils_JniUtils_getString        (JNIEnv *, jclass);#ifdef __cplusplus}#endif#endifJNIEXPORT jstring JNICALL Java_com_cmakedemo_utils_JniUtils_getString        (JNIEnv *env, jclass jobj){     return (*env)->NewStringUTF(env,"HelloWorld");}

– 6.配置你的CMakeLists.txt文件
创建CMakeLists.txt文件配置如下

cmake_minimum_required(VERSION 3.4.1) #指定cmake版本add_library(HelloWorld SHARED src/main/jni/HelloWorld.c) #括号中第一个 HelloWorld是生成的so文件的名称,要和你c/c++文件名相同target_link_libraries(HelloWorld log android) # 此处增加了,日志的链接库 

注意,上面代码中三个HelloWorld的地方必须一致,和你c/c++文件名相同

– 7.静态导包

public class JniUtils {    static{        System.loadLibrary("HelloWorld");// 你在cmakeList中设置的名称    }    public static native String getString();}

– 到这里你所有的配置就完成了,你可以调用JniUtils中的getSting方法获取c/c++中的字符串

public class MainActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        TextView tv = (TextView) this.findViewById(R.id.tv);        tv.setText(JniUtils.getString());    }}

这里写图片描述

遇到的问题

讲道理按照我上面的步骤一步一步来,是不会有什么问题的,如果不讲道理,那只能说 这里写图片描述

如果你遇到了什么问题,欢迎留言,最后屌大/胸大的同学麻烦帮忙顶一下

1 0
原创粉丝点击