Android NDK 初探

NDK与JNI

JNI提供java到native层的调用方式,我们可以用NDK工具来编译C语言的代码生成Linux平台下的动态链接库(.so)以供使用。
我将大致开发步骤记录一下,以备以后回顾。

环境
* mac os
* AdnroidStudio
* ndk-bundle

步骤

1.JAVA类

先计划好你将会在native层调用到的函数,写一个Java类封装起来。
例如:

public class HelloNative {

    public String getString(){
        return getStringFromJNI();
    }

    private native String getStringFromJNI();
}

2.生成对C代码中需要的头文件

这是JDK提供生成方式,如果想可以自己写。在main目录下新建一个目录jni,打开Terminal,进入java文件所在目录,先编译一下Java文件,确保没有什么低级错误。

javac -d ../jni ./com/compilesense/liuyi/hellondk/HelloNative.java 

生成头文件。

javah -d ../jni com.compilesense.liuyi.hellondk.HelloNative

3.编写c语言代码

就在jni目录下新建一个c文件吧。

#include <com_compilesense_liuyi_hellondk_HelloNative.h>

JNIEXPORT jstring JNICALL Java_com_compilesense_liuyi_hellondk_HelloNative_getStringFromJNI(JNIEnv * jenv, jobject job){
  retrun (*jenv)->NewStringUTF(jenv,"native say hello to java");
}

4.编写Android.mk文件

同样的在jni目录下新建 Android.mk文件。最简单情况下只写Android.mk就行了,Application.mk可以进行更多的配置,例如生成指定硬件平台的库文件。

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_SRC_FILES := HelloNative.c //源文件
LOCAL_C_INCLUDES += $(LOCAL_PATH) //头文件位置
LOCAL_MODULE = hello_native //输出的so文件的名字

include $(BUILD_SHARED_LIBRARY)//生成动态链接库

5.使用ndk编译生成动态链接库

进入jni目录,执行编译命令。

ndk-build

这样就会生成各个平台的.so文件了。
生成结果

6.执行下native程序

在main目录下新建jniLibs目录,将生成的libs里的库按需要拷贝到jniLibs中,将jni目录重命名为其他名字,以免编译报错。
然后在java中加载库并执行。

public class MainActivity extends AppCompatActivity {

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

        System.loadLibrary("hello_native");

        Log.d("MainActivity",new HelloNative().getString());
    }
}

然后编译执行,可以在LogCat中看到:
这里写图片描述

6.在c代码中打印log

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值