您的位置:首页 > 移动开发 > Android开发

AndroidStudio Jni 开发初识

2017-01-13 16:55 393 查看

NDK 是什么?

NDK是一系列工具的集合,帮助开发者快速开发C(或C++)的动态库,并能自动将so和java应用一起打包成apk

为什么使用NDK

代码的保护。由于apk的java层代码很容易被反编译,而C/C++库反汇难度较大。

提高程序的执行效率。将要求高性能的应用逻辑使用C开发,从而提高应用程序的执行效率。

便于移植。用C/C++写得库可以方便在其他的嵌入式平台上再次使用。

开始使用

下载ndk环境的这里不赘述了

添加jni文件夹



在app下的build.gradle加入ndk的配置



写调用代码

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

TextView textView = (TextView) findViewById(R.id.tv_hello);
textView.setText(strFromC());
}

//声明一个native方法
public native String strFromC();

//静态代码块里加载native方法的so库,名字和之前定义的一样
//ps:静态代码块里面的代码在类初始化时会最新被加载
static {
System.loadLibrary("hello_c");
}
}


生成.h头文件

到调用类那个文件夹下执行javah命令



javah的更多用法



在同级目录下会生成报名+类名的头文件,之后将其拖拽到jni文件下,并创建一个c文件



com_simplepeng_jnidemo_MainActivity.h
没有c基础的可以暂时不了解其中的用法和含义

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

#ifndef _Included_com_simplepeng_jnidemo_MainActivity
#define _Included_com_simplepeng_jnidemo_MainActivity
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class:     com_simplepeng_jnidemo_MainActivity
* Method:    strFromC
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_simplepeng_jnidemo_MainActivity_strFromC
(JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif


hello_c.c
没有c基础的可以暂时不了解其中的用法和含义

//包含生成的.h头文件
#include "com_simplepeng_jnidemo_MainActivity.h"
//*env 指向 JNINativeInterface 结构的指针
//obj 指向void*
//所有的都可以在jni.h中找到
JNIEXPORT jstring JNICALL Java_com_simplepeng_jnidemo_MainActivity_strFromC
(JNIEnv *env, jobject obj) {
const char *str = "hello from c";
return (*env)->NewStringUTF(env, str);
}


编译项目,生成so库





正确生成so库后就可以运行项目查看native方法是否调用成功



可以看到是成功调用到了native的方法的。

其他注意事项

在builde.gradle中配置了ndk自己就生成了Android.mk

如果报没找到ndk相关配置错误,可能就需要自己在local.properties中配置ndk的目录

ndk.dir=/Users/simple/Library/Android/sdk/ndk-bundle


或者报ndk版本问题,可能也需要在gradle.properties中配置

android.useDeprecatedNdk=true
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: