NDK一

NDK的使用场景

1 . 重要核心代码保护。由于java层代码很容易反编译,而C/C++代码反汇编难度很大,所以对于重要的代码,可以使用C/C++来编写,Android去调用即可。

2 . Android中需要用到第三方的C/C++库。由于很多优秀的第三方库(比如FFmpeg)都是使用C/C++来编写的,我们想要使用它们,就必须通过NDK的方式来操作。

3 . 便于代码的移植。比如我们对于一些核心的公共组件(比如微信开源的的Mars),可能需要写一套代码在多个平台上运行(比如在Android和iOS上共用一个库),那么就需要选用NDK的方式。

4 . 对于音视频处理、图像处理这种计算量比较大追求性能的场景,也需要使用到NDK。

1.配置ndk doc查看ndk是否配置成功 命令ndk-build
环境变量
一.NDK_ROOT ndk路径
二. Path中在最后添加 ;%NDK_ROOT%
2.Android studio 加入ndk路径 local.properties中加入ndk路径
3.gradle.properties 加入android.useDeprecatedNdk=true

public class JNI {
    public native String sayHello();
    static {
        System.loadLibrary("Hello");//“Hello”与grade配置中so文件的命名相同
    }
}

public native String getCLanguageString(); 在方法名上按alt+enter 自动创建
4.创建ndk的头文件
进入Terninal控制器
执行命令
cd app\src\java
javah 包名+类名
javah com.bianshaopeng.ndkdemo.JNI
加Java文件加下生成头文件放到jni文件夹下,
5编写c文件

#include <com_bianshaopeng_ndkdemo_JNI.h>
JNIEXPORT jstring JNICALL Java_com_bianshaopeng_ndkdemo_JNI_sayHello
        (JNIEnv *env, jobject instance){
    return (*env)->NewStringUTF(env, "Hello World");
}

5.配置grade
ndk {
moduleName “Hello”//so文件名
abiFilters “armeabi”, “armeabi-v7a”, “x86”//CPU类型
}
放到
defaultConfig {
applicationId “com.bianshaopeng.ndkdemo”
minSdkVersion 15
targetSdkVersion 26
versionCode 1
versionName “1.0”
testInstrumentationRunner “android.support.test.runner.AndroidJUnitRunner”
ndk {
moduleName “Hello”
abiFilters “armeabi”, “armeabi-v7a”, “x86”
}
}
6.rebuild项目 在activity中调用

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        String str = new JNI().sayHello();
        Log.d("tag",str);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值