频道栏目
首页 > 程序开发 > 移动开发 > 其他 > 正文
windows平台下AS1.5_NDKr10d开发实例
2016-11-30 09:49:36         来源:Vincent  
收藏   我要投稿

JNI 是一个协议, NDK 是Android用于开发Jni的工具包
1、下载android-ndk-r13b-windows-x86.zip压缩文件,放到一个没有中文没有空格的目录下面,比如E:\AndroidDev\AndroidSDK。然后解压缩到当前目录下面
2、将ndk目录配置到系统环境变量path中,将E:\AndroidDev\AndroidSDK\android-ndk-r13b-windows-x86\android-ndk-r13b加到path中
过程:
path src

C:\ProgramData\Oracle\Java\javapath;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\Skype\Phone\;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;E:\AndroidDev\GitDevTool\Git\cmd

path: dest

  ASDKH :   E:\AndroidDev\AndroidSDK
    C:\ProgramData\Oracle\Java\javapath;%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;%SYSTEMROOT%\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\Skype\Phone\;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;E:\AndroidDev\GitDevTool\Git\cmd;%ASDKH%\android-ndk-r13b-windows-x86\android-ndk-r13b;%ASDKH%\android-ndk-r13b-windows-x86\android-ndk-r13b\build;%ASDKH%\platform-tools;%ASDKH%\tools;%ASDKH%\build-tools

3、在as中关联NDK
3.1、在工程目录下 <工程目录>/local.properties文件中加入NDK目录

ndk.dir=E\:\\AndroidDev\\AndroidSDK\\android-ndk-r10d

3.2、在工程目录下: <工程目录>/gradle.properties文件加入兼容老的ndk

#兼容老的NDK
android.useDeprecatedNdk=true

4、环境配置好后要实现第一个AS 用java通过ndk调用c代码
4.1、 NDK开发流程
1、在java里面写使用的native代码,定义一个JniC类,用于调用对应的native C代码。下面是调用C代码的接口类

package com.org.vincent.appjni;

/**
 * Created by Administrator on 2016/11/29.
 */
public class DemoJni {

    //增加对so库的加载
    static {
        System.loadLibrary("app");
    }
    private  native  String getString();
    public String getStringFromC(){
        return new DemoJni().getString();
    }
}
com.org.vincent.appjni.DemoJni 类名
com.org.vincent.appjni.DemoJni#getString 类名加方法名

写好接口方法之后接下来就是关键了,点击 Build -> Make Project, 如下图
这里写图片描述 <喎"/kf/ware/vc/" target="_blank" class="keylink">vcD4NCjxwPr2ryc/D5rao0uW1xERlbW9KbmkgwODUtMLrzsS8/rHg0uuzyWNsYXNzzsS8/jvU2mFwcF9wYXRoL2J1aWxkL2ludGVybWVkaWF0ZXMvY2xhc3Nlcy9kZWJ1Z8S/wrzPwr+009DDu8n6svpjbGFzc87EvP48L2NvZGU+PC9jb2RlPjwvY29kZT48L2NvZGU+PC9jb2RlPjwvY29kZT48L2NvZGU+PC9jb2RlPjwvcD4NCjxwPjKhokJ1aWxkILPJuabWrrrzo6y+zdTaVGVybWluYWwgw/zB7tDQvfjI6zwvY29kZT48L2NvZGU+PC9jb2RlPjwvY29kZT48L2NvZGU+PC9jb2RlPjwvY29kZT48L2NvZGU+PC9wPg0KPHByZSBjbGFzcz0="brush:java;"> javah -d jni -classpath E:\AndroidDev\AndroidSDK\platforms\android-23\android.jar;..\..\build\intermediates\classes\debug com.org.vincent.appjni.DemoJni

如下图:
这里写图片描述
注意 ;..\..\ 不能有空格,这个条件有点坑爹

执行上面javah命令后在main目录下自动生成了jni目录,里面躺着了刚才我们需要的头文件。
这里写图片描述
在jni目录下新建一个名字为main.c的文件,文件内容如下:

#include "com_org_vincent_appjni_DemoJni.h"
#include 
#include 
#include 
JNIEXPORT jstring JNICALL Java_com_org_vincent_appjni_DemoJni_getString
        (JNIEnv * env, jobject job){
      __android_log_print(0,"JNI","I LOVE YOU PENGRONGPENGRONGPENGRONGPENGRONGPENGRONG");
      return (*env)->NewStringUTF(env,"PENGRONGPENGRONGPENGRONGPENGRONGPENGRONGPENGRONG");
}

做最后的构建配置工作。
app/build.gradle文件下面android 节点子节点defaultConfig 下面增加NDK节点


  ndk{
            moduleName "app"
            ldLibs  "log"
            abiFilters "armeabi", "armeabi-v7a", "x86"
        }

moduleName 和static {System.loadLibrary(“json”);}名字一样的啊。

在android节点新增新子节点:这个不清楚为什么需要,我没有加入也可以正确执行。

sourceSets.main {
        jniLibs.srcDirs 'libs'
        jni.srcDirs = []
    }   

在新创建的jni目录下编辑C源文件实现原生代码逻辑 ,

5、期间出现

Error:Execution failed for task ':app:compileDebugNdk'.
> com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command 'E:\AndroidDev\AndroidSDK\android-ndk-r10d\ndk-build.cmd'' finished with non-zero exit value 2

的事情,查阅网上是在jni目录下新建一个空白的util.c文件

6、编译出来的库文件被Studio输出到了app_path/build/intermediates/ndk的路径下。

这里写图片描述

7、安装运行
运行图
这里写图片描述

 

点击复制链接 与好友分享!回本站首页
相关TAG标签 windows平台 AS
上一篇:cocos2dx 常用动作使用指南
下一篇:实现Activity跳转动画的五种方式
相关文章
图文推荐
点击排行

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站