Android NDK JNI 简单调试 demo

Java Native Interface (JNI)标准是java平台的一部分,它允许Java代码和其他语言写的代码进行交互。JNI 是本地编程接口,它使得在 Java 虚拟机 (VM) 内部运行的 Java 代码能够与用其它编程语言(如 C、C++ 和汇编语言)编写的应用程序和库进行交互操作。
由于Android的应用层的类都是以Java写的,这些Java类编译为Dex型式的Bytecode之后,必须靠Dalvik虚拟机(VM: Virtual Machine)来执行。VM在Android平台里,扮演很重要的角色。

1.先建一个NdkJniDemo的工程

2.新建JniUtils类实现native方法

public class JniUtils {    public static native String getStringFormC();
}

3.如图操作:


4.然后 clean project 在 rebuild project 生成 class 文件;这时候打开如下图的文件夹看是否生成了 classes 文件夹,没有生成请重新来过。如下图:

5.再打开 Terminal 输入指令(其实在 Terminal 我命令没有执行成功,我是直接在 dos 中去执行的命令。)

cd app/build/intermediates/classes/debug

然后在输入指令

javah -jni com.wobiancao.ndkjnidemo.ndk.JniUtils
注意 这里的 javah -jni 后面跟的是 JniUtils 类的全路径,如果 javah 报不存在之类的,是你的 java 环境没有配置好。( 也可以在 dos 命令窗口来执行上面的命令)

6.这时候打开 classes/debug 下面的文件发现多了一个文件

com_wobiancao_ndkjnidemo_ndk_JniUtils.h
然后在 src/main 下新建文件夹 jni,把生成的 .h 文件复制或者剪切到 jni 文件夹下面去,新建一个 c 类随便取一个名字,添加代码如下:

 Created by XY on 16/1/4.//#include "com_wobiancao_ndkjnidemo_ndk_JniUtils.h"/* 
* Class:     Java_com_wobiancao_ndkjnidemo_ndk_JniUtils 
* Method:    getStringFormC 
* Signature: ()Ljava/lang/String; 
*/JNIEXPORT jstring JNICALL Java_com_wobiancao_ndkjnidemo_ndk_JniUtils_getStringFormC
        (JNIEnv *env, jobject obj){ 
   return (*env)->NewStringUTF(env,"这里是来自c的string");  注意这里的方法名要求和第二步中类的方法名一直,不然会报错

这里发现头文件 #include<jni.h>报红色,是因为咱们还没有配置 ndk 环境,打开 file->project structure 选择你所下载的 ndk 环境路径,如果没有 ndk 这里有个地址大家可以去下载 一个安卓工具集合的网站:http://androiddevtools.cn/


7.我们要在 jni 目录下创建 Android.mk 和 Application.mk 文件

Android.mk文件内容为

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_MODULE := app
LOCAL_SRC_FILES := jnitest.c

include $(BUILD_SHARED_LIBRARY)

Application.mk内容为(这个配置是为了生成所有平台的so库,若不配置只会生成armeabi目录下的)

APP_ABI := all

8.配置 Gradle

在defaultConfig下,配置ndk:

ndk {
   moduleName "app" // 生成的so名字 
}

在android标签内配置sourceSets:
注意:这里也有坑
若此处没设置会报[Execution failed for task ':app:compileDebugNdk']这个错误

sourceSets.main {   
   jni.srcDirs = ['libs']
}
9.生成的 so 文件都在 src/main/libs 目录下:
在 Terminal 下执行 ndk-build

(其实 Terminal 中我命令没有成功,可以到 dos 窗口中去执行命令是一样的。但是需要到下图的文件路径下去执行 ndk-build)


11. 截止到目前我们的.so库就全部生成了

----------------------------------------分割线--------------------------------------
下面就是对我们的so的使用了

1、在main文件中创建jniLibs 将我们的libs下的so文件拷贝到下面去
2、在JniUtils类中添加代码块

static {   
   System.loadLibrary("app");   //defaultConfig.ndk.moduleName
}

3、运行的我们的程序就能看到开始图上的结果了


----------------------------------------分割线--------------------------------------

在加上 NDK 环境变量的配置和验证:

1、首先是要配置NDK(若是已经配置过NDK请略过此步骤)

官网下载NDK地址(此地址下载需要翻墙)
若是你翻不了墙请移步至
一个强大的下载网站(Androiddevtools你值得拥有)
下载好之后是个压缩包,应该做什么你应该知道了,然后下面进行第二步
2、配置环境变量

创建NDK_HOME

(我按照下图步骤对 ndk 的环境变量进行了配置,但是不行。最后我直接在 path 路径中添加 ndk 的路径 D:\android-ndk-r13b-windows-x86_64\android-ndk-r13b ,却可以执行命令)



再将配置好的NDK_HOME添加到PATH环境变量中


配置好之后可以测试是否配置正确 ,打开cmd在里面输入ndk-build


出现上述结果就说明ndk环境变量已经设置成功了,提示信息是因为没有定义NDK_PROJECT_PATH变量,此处用不到,我们暂不处理

----------------------------------------分割线--------------------------------------

上面方法步骤主要是参照这两篇博客:

http://www.open-open.com/lib/view/open1451917048573.html

http://www.jianshu.com/p/5fc674ee4810;然后在集合自己踩过的坑进行了补充修改。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值