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

上一篇我们讲述了通过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 __cplusplus
extern "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
#endif

JNIEXPORT 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值