前几次总结了一下关于C或C++的基础知识及其开发流程。之前也大部分都是基于Elipse的。今天我们用AndroidStudio来开启我们的第一个项目实战。
但是基于AndroidStudio方面,以后趋势都是AndroidStudio开发NDK的,我们也同样的以后要用ES进行开发NDK.
先看效果图:
Java代码中调用C代码
!
C代码调用Java代码中

AndroidStudio环境配置:
- 环境搭建 - 请参考: - 下载地址 :https://developer.android.com/ndk/downloads/index.html(需要翻墙,你懂得) 
- 在File–>Project Structure配置其路径 
- 添加 ndk 后你会在 local.properties 这个文件看到(路径取决于你 ndk 的位置):  
- 在此处加上这句代码:android.useDeprecatedNdk=true好了,ndk 环境搭建完毕!  
 
开发示例流程
1.编写native方法
public class NdkJniUtils {
static {
    System.loadLibrary("myJniApp");
    System.loadLibrary("unstallApp");
}
public native String getCLanguageString();
public native void uninstallListener();
}
2.在src/main目录下创建jni文件夹
3.生成.h头文件
1.首先build或者是make project使项目生成.class文件
2.在Androidstudio下的Terminal窗口里生成.h头文件
3.javah 包名.类名
如:
Javah jni.yyh.com.mycptojavanative.jni.cold.yyh.com.myndk01.NdkJniUtils
4.将生成的.h头文件Copy到jni目录下面
3.编写C代码
在jni目录里右击项目,新建.C文件进行编写C代码
现将生成的h文件里的内容Copy到.c文件里面去
去除不关联的无用的内容
按照规范进行C代码代码的编写
最后C代码示例:
#include <jni.h>
JNIEXPORT jstring JNICALL Java_cold_yyh_com_myndk01_NdkJniUtils_getCLanguageString (JNIEnv * env, jobject obj){
 return (*env)->NewStringUTF(env,"你好,ndk,我来了");
}
4.编写Android.mk文件
网上有很多博文来并没有要求建立Android.mk文件
但是为了正确的编译C代码,防止编译出错,这里我建议最好创建Android.mk
之前在Eclipse中建议将jni.h文件copy到jni文件夹下面,这里androids是之内的,无需做此操作
5.配置相关的gradle
声明ndk标签
如果不声明ndk标签,项目默认会创建一个libapp.so的文件(存放目录app\build\intermediates\ndk)
ndk {
            // 声明创建so库的文件名,会自动添加lib前缀, 添加了前缀,不会自动添加
            moduleName "serviceData"
            //声明启用Android日志, 在c/c++的源文件中使用的#include <android/log.h> 日志将得到输出
            ldLibs "log"//实现__android_log_print
            // 声明创建指定cpu架构的so库, 不声明的话, 默认(gradle 1.5.0)会生成4中架构 多一种mips架构
            // 具体cpu架构的区别请参考:
            // for detailed abiFilter descriptions, refer to "Supported ABIs" @
            // https://developer.android.com/ndk/guides/abis.html#sa
            abiFilters "armeabi", "armeabi-v7a", "x86"
        }
//指定Android.mk文件
    externalNativeBuild{
        ndkBuild{
            path "src/main/jni/Android.mk"
        }
    }
//指定so文件路径
sourceSets.main {
        // 1. 配置在根目录libs下可以加载第三方so库, (最好不要创建jniLibs, 在众多的开源库中可能会引起冲突,还没发现)
        // 2. 运行时会自动将libs目录下的so库拷贝到指定目录
        // 3. 如果自己创建的so不需要重新编译,可以将(app/build/intermediates/transforms)生成的so拷贝到这个目录
        jni.srcDirs = []
        // 如果是单个文件夹 可以直接这样如下配置
       //jniLibs.srcDir 
       //设置目标的so存放路径
        jniLibs.srcDir 'src/main/jniLibs'
    }
6.生成.so文件
利用AndroidStudio进行生成.so文件
build APK 、Make Project 、make Project Model 或者是 Rebuild Project 都能生成.so文件
注意:之前有找不到.so文件的情况,
这里已经解决。
其实so文件是存在 (app/build/intermediates/transforms)目录下的
将生成的so文件Copy到jniLibs文件夹下。
注意这里要新建jnilibs。
这里你也可以用命令指定生成ndk-build.cmd
7.在Java代码中调用动态链接库(.so)
    在相应的地方进行加载so文件 
    static {
        System.loadLibrary("myJniApp");
        System.loadLibrary("unstallApp");
    }
8.调用
示例代码:
private Button  btn_onclick,btn_onclick2;
private TextView mTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mTextView = (TextView) this.findViewById(R.id.test);
    btn_onclick = (Button) this.findViewById(R.id.btn_onclick);
    final NdkJniUtils jni = new NdkJniUtils();
    btn_onclick.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
        mTextView.setText(jni.getCLanguageString());
        }
    });
   findViewById(R.id.btn_onclick2).setOnClickListener(new View.OnClickListener() {
       @Override
       public void onClick(View view) {
          jni.uninstallListener();
           mTextView.setText("监听SD卡状态,查log日志");
       }
   });
项目下载地址:
github相关下载连接:
AndroidStudio项目:
如果下载不了,也可以通过csdn下载
AndroidStudio项目:
之前基于Eclise相关所写的介个项目
运行我的第一个ndk项目
http://download.csdn.net/detail/androidstarjack/9855296
仿银行登录系统
http://download.csdn.net/detail/androidstarjack/9855292
博客地址:
http://blog.csdn.net/androidstarjack/article/details/72758094
NDK探究之旅:
### 相信自己,没有做不到的,只有想不到的 
 如果你觉得此文对您有所帮助,欢迎入群 QQ交流群 :232203809 
 微信公众号:终端研发部 

(欢迎关注学习和交流)
 
                   
                   
                   
                   
                            
 
                             
                             
       
           
                 
                 
                 
                 
                 
                
               
                 
                 
                 
                 
                
               
                 
                 扫一扫
扫一扫
                     
                     
              
             
                   3893
					3893
					
 被折叠的  条评论
		 为什么被折叠?
被折叠的  条评论
		 为什么被折叠?
		 
		  到【灌水乐园】发言
到【灌水乐园】发言                                
		 
		 
    
   
    
   
             
					 
					 
					


 
            