NDK探究之旅《八》——jni的开发流程规范
来源:互联网 发布:js 执行 dll 编辑:程序博客网 时间:2024/05/16 08:14
今天我们来探讨一下基于Eclipse的jni开发流程规范
1.在Java代码中声明一个native方法。让C来实现里面的逻辑。如
public native String helloFromC();
2.在Eclipse的工程下面创建出来一个的文件夹,起名为jni
3.编写C代码,按照规范进行编写
jstring Java_com_yyh_jni_MainActivity_helloFromC(JNIEnv* env,jobject obj){ //c代码; char* str = "hello from c 123!!"; //在jni规范里面 在jni环境的结构体里面 //jstring (*NewStringUTF)(JNIEnv*, const char*); //转化成了java的字符串 return (*(*env)).NewStringUTF(env,str);}
4.配置Android.mk文件,有时候根据实际需要配置Application.mk
- 文件
Android.mk
#指定编译的文件夹 指定当前文件目录LOCAL_PATH := $(call my-dir)#编译器会定义很多的临时变量,中间变量,最好清空所有的中间变量。include $(CLEAR_VARS)LOCAL_MODULE := helloLOCAL_SRC_FILES := hello.cinclude $(BUILD_SHARED_LIBRARY)
Application.mk
5.编译指令C代码:ndk-build.cmd
6.生成一个.so动态链接库
7.在Java代码中调用动态链接库(.so)
{ System.loadLibrary("hello");}
8.调用jni方法,把他作为普通方法
btn_onClicl.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { String ss = helloFromC(); Toast.makeText(MainActivity.this,ss, Toast.LENGTH_SHORT).show(); } });}
基于Androidstudio的开发流程配置
前提条件
- 需要安装最新版的Java
- 之后要去先下载最新的Android Studio:
https://developer.android.com/studio/index.html
- 也可以使用国内的镜像网站
- [http://www.android-studio.org/ ]
(http://www.android-studio.org/) 下载。
Android Studio 会自动下载Android SDK,Gradle等开发工具。
而NDK就需要自己手动安装了。
http://www.cnblogs.com/why168888/p/5592017.html
手动配置
一、下载ndk的安装包进行配置
下载地址:
http://developer.android.com/sdk/ndk/index.html打开下载页面后选择的下载文件为
android-ndk-r12-windows-x86_64.zip。
或者我这边已经下载好。百度云盘链接:链接:http://pan.baidu.com/s/1miLqaY8 密码:1o5d
- 配置环境变量
我们测试环境变量的配置成功与否。在cmd命令行窗口输入“ndk-build”,输出以下信息即为配置正确。如图:
点击AndroidStudio菜单栏找到”File”-“Project Structure…”,打开界面,进行Android ndk路径配置
接着在Android NDK Location中,选择刚才解压的NDK系统文件路径,配置之后,在项目的local.properties配置文件中看到NDK路径,说明我们配置成功 !
二、插件化进行配置
相关配置地址:
http://www.th7.cn/Program/Android/201509/572743.shtml
这里要注意的是:
在AndroidStudio开发ndk目前Androidstudio对与ndk开发来说还不是太稳定,最好不要用最新的android-ndk-rX开发工具包
这里简单说一下我的第一个AndroidStudio的项目流程:
- NDK接口、
public class NdkJniUtils { static { System.loadLibrary("myJniApp"); } public native String getCLanguageString();}
- 二、
创建jni文件边
- 三 、利用JavaH生成.h
D:\project\ndk\MyApplication2\app\build\intermediates\classes\debug>javah cold.yyh.com.myndk01.NdkJniUtils
- 四、编写C代码
利用生成的.h文件将其中的关键代码copy到.c文件夹中去
/* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* Header for class cold_yyh_com_myndk01_NdkJniUtils */#ifndef _Included_cold_yyh_com_myndk01_NdkJniUtils#define _Included_cold_yyh_com_myndk01_NdkJniUtils#ifdef __cplusplusextern "C" {#endif/* * Class: cold_yyh_com_myndk01_NdkJniUtils * Method: getCLanguageString * Signature: ()Ljava/lang/String; */JNIEXPORT jstring JNICALL Java_cold_yyh_com_myndk01_NdkJniUtils_getCLanguageString (JNIEnv *, jobject);#ifdef __cplusplus}#endif#endif
C代码中:
/* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>JNIEXPORT jstring JNICALL Java_cold_yyh_com_myndk01_NdkJniUtils_getCLanguageString (JNIEnv * env, jobject obj){ return (*env)->NewStringUTF(env,"你好,ndk,我来了");}
五、创建Android.mk和Application.mk文件
注意这里亲测过,没有Android.mk文件和Application.mk文件也可以的
这里为了避免错误还是按照正确的开发步骤进行编写- 六build.gradle相关配置
在Android{}中添加
ndk{ moduleName "myJniApp" //生成的so名字 ldLibs "log" //Log打印 abiFilters "armeabi", "armeabi-v7a", "x86" //输出指定三种abi体系结构下的so库。目前可有可无。 }
externalNativeBuild{ ndkBuild{ path "src/main/jni/Android.mk" } }
sourceSets.main { jni.srcDirs = [] jniLibs.srcDir 'src/main/libs' }
最后build工程生成.so文件
build——>Rebuild Model App 或者 make project
*注意*
最后竟然没发现.so文件在哪里,但项目依然编译成功,并且正常运行正确调到C中的方法。
其中.so文件会出现在你的app下的build下intermediates项目文件里面,只需要将其拷贝到里面即可。
但事实发现ndk版本越高的话,竟然仍然 在其下面找不到.so文件。应该说是一个AndroidStudio还不太成熟。这里留着以后在研究。
博客地址:
http://blog.csdn.net/androidstarjack/article/details/72615926
NDK探究之旅:
NDK探究之旅《一》——对jni和NDK的认识
NDK探究之旅《二》——C语言的基本认识
NDK探究之旅《三》—C语言的输入输出函数
NDK探究之旅《四》——指针的强化理解
NDK探究之旅《五》——指针和数组之间的关系
NDK探究之旅《六》—函数的指针、结构体、枚举、宏定义
NDK探究之旅《七》—函数指针,宏定义的优缺点及应用场景
### 相信自己,没有做不到的,只有想不到的
如果你觉得此文对您有所帮助,欢迎入群 QQ交流群 :232203809
微信公众号:终端研发部
(欢迎关注学习和交流)
- NDK探究之旅《八》——jni的开发流程规范
- NDK探究之旅《九》——jni开发中常见的错误及其注意事项
- NDK探究之旅《一》——对jni和NDK的认识
- NDK探究之旅《十》——ndk项目实战之Androidstudio开发经验总结
- JNI与NDK的开发流程
- Android NDK开发之旅(1): Eclipse中NDK环境搭建与JNI开发流程
- Android Studio 中 NDK 开发之JNI开发规范
- 第八篇:jni的开发流程规范
- NDK开发 - JNI开发流程
- JNI和NDK编程(二)NDK的开发流程
- JNI和NDK编程(一)JNI的开发流程
- Android的NDK开发(1)————Android JNI简介与调用流程
- Android的NDK开发(1)————Android JNI简介与调用流程
- Android的NDK开发(1)————Android JNI简介与调用流程
- Android的NDK开发(1)————Android JNI简介与调用流程
- Android的NDK开发(1)————Android JNI简介与调用流程
- Android的NDK开发(1)————Android JNI简介与调用流程
- Android的NDK开发(1)————Android JNI简介与调用流程
- Shell脚本基础8-逻辑与
- 【kotlin从入门到深坑】系列目录
- inception 自动化sql审核
- C语言模拟实现多态
- Together项目后台开发04
- NDK探究之旅《八》——jni的开发流程规范
- POJ3046-Ant Counting
- 牛客网编程小结(三)——long long
- 算法设计作业13
- 分布式开放消息系统(RocketMQ)的原理与实践
- 在线云评测系统日志四
- Deep Learning 最优化方法之Nesterov(牛顿动量)
- 今天主要学习的是 链表,单链,循环链表和双向链表,总体感觉还可以,还是有点懵懵的,需要勤加练习。
- HDU 筛素数