注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

罔少年

QQ 332256483

 
 
 

日志

 
 

android studio ndk  

2015-06-30 09:50:24|  分类: android |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
前言:
前段时间领导想在android项目中调用c,c++
然后恶补资料,貌似需要掌握ndk,jni,.so 其实我到现在也不明白这3个货是啥,有啥作用
大致了解下,不知道对不对:
.so:c动态库
jni:可以使你的java项目调用c,c++动态库
ndk:一个工具,可以使你在android studio中直接开发c,c++动态库,也就是.so

使用:
下载NDK开发工具

一、新建studio项目,添加native接口
package com.zjcpo.library;
public class NdkActivity extends Activity {

static {
System.loadLibrary("JniTest");
}

//添加native接口
public native String getStringFromNative();

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

TextView tv_ndk = (TextView) this.findViewById(R.id.tv_ndk);
tv_ndk.setText(getStringFromNative());

}
}

二、生成.class文件

android studio ndk - 我是小黄人 - lanaiver6291的博客
 Build -- Make Project
可以在项目的build/intermediates/classes/debug...下看到编译好的.class文件
android studio ndk - 我是小黄人 - lanaiver6291的博客
 

三、javah生成c头文件

打开编译器 android studio View -- Tool Windows -- Terminal
进入<project>\app\src\main目录,需要执行2步代码
1、需要编译的对应版本sdk目录
android studio ndk - 我是小黄人 - lanaiver6291的博客
 
2、找到需要编译成.so的java文件,我这边就是NdkActivity.java
android studio ndk - 我是小黄人 - lanaiver6291的博客
 然后把上面的两个路径写到编译器中,代码如下

I:\workspace\zjcpo_library\app\src\main>javah -d jni -classpath C:\Users\jiemiao.zhang\AppData\Local\Android\sdk\platforms\android-21\android.jar;..\..\build\intermediates\classes\debug com.zjcpo.library.NdkActivity


上面这段代码的意思是,先定位到项目的src\main目录下,然后执行 javah -d jni -classpath <你的sdk目录>;..\..\build\intermediates\classes\debug <你想编译的那个文件目录(com.zjcpo.library.NdkActivity)>
按回车
可以看到你的项目中 src\main下多了一个jni文件夹,点开有个com_zjcop_library_NdkActivity.h
android studio ndk - 我是小黄人 - lanaiver6291的博客
 
四、编辑c文件,写c函数

随便哪边建一个main.c文件,然后放到jni目录下。编辑内容
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
#include <android/log.h>

#ifndef LOG_TAG
#define LOG_TAG "ANDROID_LAB"
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)
#endif

/* Header for class lab_sodino_jnitest_MainActivity */

#ifndef _Included_com_zjcpo_library_NdkActivity
#define _Included_com_zjcpo_library_NdkActivity
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: lab_sodino_jnitest_MainActivity
* Method: getStringFromNative
* Signature: ()Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_zjcpo_library_NdkActivity_getStringFromNative
(JNIEnv * env, jobject jObj){
LOGE("log string from ndk.");
return (*env)->NewStringUTF(env,"Hello From JNI!..................");
}

#ifdef __cplusplus
}
#endif
#endif
上面这段代码看太不懂,大致意思就是写了一个getStringFromNative()方法,输出“log string from ndk.”,并返还“Hello From JNI!..................”。有两点要注意
1、_Included_com_zjcpo_library_NdkActivity 后面的com_zjcpo_library_NdkActivity 改成你的包名+文件名
2、JNIEXPORT jstring JNICALL Java_com_zjcpo_library_NdkActivity_getStringFromNative 也是com_zjcpo_library_NdkActivity 改成你的包名+文件名+方法名
然后再"Build->Make Project"一下

五、在项目中配置NDK


2、打开local.properties文件,添加你的ndk安装路径
sdk.dir=C\:\\Users\\jiemiao.zhang\\AppData\\Local\\Android\\sdk
ndk.dir=C\:\\Users\\jiemiao.zhang\\Downloads\\android-ndk-r10e
3、修改app下的build.grade文件,添加下面这段代码

ndk {
moduleName "JniTest"
ldLibs "log", "z", "m"
abiFilters "armeabi", "armeabi-v7a", "x86"
}


android studio ndk - 我是小黄人 - lanaiver6291的博客
 
4、执行"Build->Rebuild Project",编译出so文件了。
在app\build\intermediates\ndk\debug\lib 文件下
android studio ndk - 我是小黄人 - lanaiver6291的博客
 
六、运行项目
android studio ndk - 我是小黄人 - lanaiver6291的博客
 

  评论这张
 
阅读(58)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018