NDK开发之入门了解

2017-10-22  本文已影响0人  肚皮怪_Sun

Android NDK 是在SDK前面又加上了“原生”二字,即Native Development Kit,因此又被Google称为“NDK”。众所周知,Android程序是运行在Dalvik虚拟机中,NDK允许用户使用类似C / C++之类的原生代码语言执行部分程序。
NDK包括了:
从C / C++生成原生代码库所需要的工具和build files。
将一致的原生库嵌入可以在Android设备上部署的应用程序包文件(application packages files ,即.apk文件)中。
支持所有未来Android平台的一系列原生系统头文件和库

JNI是Java Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是C&C++)。

通俗点说NDK其实一个环境,可以为我们生成了C/C++的动态链接库。JNI是java和C/C++沟通的接口,为我们规定了一套标准(其实DNK也是基于JNI这个编码规范开发的) 。而Android程序是用java语言开发,然后通过JNI我们可以和C/C++进行交互。这样我们就可以用DNK和JNI来完成java+C/C++的方式。

概括来说主要分为以下几种情况:

  1. 代码的保护,由于apk的java层代码很容易被反编译,而C/C++库被反编译的难度较大。
  2. 在NDK中调用第三方C/C++库,因为大部分优秀的开源库都是用C/C++代码编写的。
  3. 便于移植,用C/C++写的库可以方便在其他的嵌入式平台上再次使用。
  4. 硬件和性能方面。java是不能直接访问手机的硬件的,而C/C++的可以直接访问。

创建项目和平常一样只是要把C++支持(invlude C++ suppoer)勾选,


6534BF73-0D5D-4CEF-8B79-66077A6CCAE4.png
  1. Exceotions Support(支持异常处理)
  2. Runtime Type information(支持运行时类型信息)
1087DFCC-CA7C-4FF9-A35D-87C60EF108C0.png

创建完以后,我们会发现多了一个cpp的文件


4F1BE064-6238-4105-8AE7-06E91FC051BC.png
public class MainActivity extends AppCompatActivity {

// Used to load the 'native-lib' library on application startup.
//加载so库或jni库,在使用到该库之前加载就行
static {
    System.loadLibrary("native-lib");
}

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

    // Example of a call to a native method
    TextView tv = (TextView) findViewById(R.id.sample_text);
    tv.setText(stringFromJNI());
}

/**
 * A native method that is implemented by the 'native-lib' native library,
 * which is packaged with this application.
 *将用C++代码实现,在android代码中调用的方法
 */
public native String stringFromJNI();

在我们的native-lib.cpp文件中有个...stringFromJni方法中返回的了一段jstring:Hello from C++。
extern "C":允许在编译的时候成C文件,向下兼容。(本身是 C++)
JNIEXPORT:作用是允许该方法被java调用。
JNICALL:约束函数如栈顺序,和堆栈内存清理的规则

#include <jni.h>
#include <string>

extern "C"
JNIEXPORT jstring JNICALL
Java_com_captain_wudongsheng_day3ndk_MainActivity_stringFromJNI(
    JNIEnv *env,
    jobject jobject1/* this */) {

std::string hello = "Hello from C++";
return env->NewStringUTF(hello.c_str());
}
943F5594-8DAB-4D10-A30C-F2EA09AB1184.png

运行完项目你会发现textView设置的内容为Hello from C++,说明我们调用成功了。

上一篇下一篇

猜你喜欢

热点阅读