资讯专栏INFORMATION COLUMN

简单的NDK开发

tomener / 2718人阅读

摘要:配置环境,进行简单开发下载环境变量配置为和配置环境目录保证命令和命令可以直接在命令行使用。使用方法在中使用方法设置的最后效果如下

配置NDK环境,进行简单Native开发
NDK下载
环境变量配置

为ndk和jdk配置环境目录保证javah命令和ndk-build命令可以直接在命令行使用。

为AndroidStudio工程配置NDK路径

打开local.properties文件,添加ndk目录:


sdk.dir=C:Users
ealheAppDataLocalAndroidSdk
ndk.dir=D:
dkandroid-ndk-r10c

打开build.gradle,在defaultConfig中添加ndk{}:

android {
    compileSdkVersion 24
    buildToolsVersion "24.0.0"

    defaultConfig {
        applicationId "com.example.realhe.myapplication"
        minSdkVersion 19
        targetSdkVersion 24
        versionCode 1
        versionName "1.0"
      //配置处如下
        ndk{
            moduleName "test"            //生成的so名字
            abiFilters "armeabi", "armeabi-v7a", "x86"    //输出指定三种abi体系结构下的so库
        }
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
        //此处为调试配置,可选项
            ndk {
                debuggable = true
            }
        }
        debug {
            debuggable = true
        //此处为调试配置,可选项
            jniDebuggable = true
        }
    }

}

保存后可能发生

NDK integration is deprecated in the current plugin. Consider trying the new experimental plugin

解决方法为在gradle.properties 中添加一行:

android.useDeprecatedNdk=true
JNI初步
创建文件夹

new > Folder >JNI Folder创建jni文件夹,默认目录为

app/src/main/jni

新建一个使用jni的类
public class Test {
    static {
        System.loadLibrary("test");//需要与前面的so文件名保持一致
    }
    public native String get();
    public native void set(String str);
    public native int getToken(int token);
}
导出Test类的native方法对应的头文件:
C:Users
ealheAndroidStudioProjectsMyApplication>
javah -classpath 
appuildintermediatesclassesdebug 
-d 
appsrcmainjni 
com.example.realhe.myapplication.Test

上面参数的含义依次是javah命令,classpath路径

.class文件所在的文件夹appuildintermediatesclassesdebug

-d:输出.h到目标文件夹appsrcmainjni (即前面我们制定的默认jni文件夹)

com.example.realhe.myapplication.Test:含有native方法的类

注意这个地方一定要在项目根目录下使用,而不能切换到 Test类的.class文件所在目录直接使用

之后可以看到生成的头文件:

/* DO NOT EDIT THIS FILE - it is machine generated */
#include 
/* Header for class com_example_realhe_myapplication_Test */

#ifndef _Included_com_example_realhe_myapplication_Test
#define _Included_com_example_realhe_myapplication_Test
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_example_realhe_myapplication_Test
 * Method:    get
 * Signature: ()Ljava/lang/String;
 */
JNIEXPORT jstring JNICALL Java_com_example_realhe_myapplication_Test_get
  (JNIEnv *, jobject);

/*
 * Class:     com_example_realhe_myapplication_Test
 * Method:    set
 * Signature: (Ljava/lang/String;)V
 */
JNIEXPORT void JNICALL Java_com_example_realhe_myapplication_Test_set
  (JNIEnv *, jobject, jstring);

/*
 * Class:     com_example_realhe_myapplication_Test
 * Method:    getToken
 * Signature: (I)I
 */
JNIEXPORT jint JNICALL Java_com_example_realhe_myapplication_Test_getToken
  (JNIEnv *, jobject, jint);

#ifdef __cplusplus
}
#endif
#endif
实现头文件中的方法

在默认的JNI文件夹中新建一个test.c文件,包含上述头文件并实现其中的方法:

//
// Created by realhe on 2016/7/18.
//
#include "com_example_realhe_myapplication_Test.h"
static int count = 0;
JNIEXPORT jstring JNICALL Java_com_example_realhe_myapplication_Test_get
        (JNIEnv *env, jobject obj){
return (*env)->NewStringUTF(env,"This is a test for NDK!");
}

/*
 * Class:     com_example_realhe_myapplication_Test
 * Method:    set
 * Signature: (Ljava/lang/String;)V
 */
JNIEXPORT void JNICALL Java_com_example_realhe_myapplication_Test_set
(JNIEnv *env, jobject ibj, jstring jsr){}

/*
 * Class:     com_example_realhe_myapplication_Test
 * Method:    getToken
 * Signature: (I)I
 */
JNIEXPORT jint JNICALL Java_com_example_realhe_myapplication_Test_getToken
        (JNIEnv *env, jobject obj, jint jinvar){
    return count++;
}

注意:此处由于ndk的一个BUG,在编译单个.c文件时会报错:

com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process "command "D:ndkandroid-ndk-r10ndk-build.cmd"" finished with non-zero exit value 2

解决方法为在同级目录下增加一个empty.c的空文件即可。

使用Native方法

在MainActivity中使用Nativce方法设置TextViewText:

TextView textView = (TextView)findViewById(R.id.tv_hello);
Test test = new Test();
String content = test.get();
for (int i = 0;i<10;i++){
  content += ("
("+ test.getToken(1) + ")");
}
textView.setText(content);

最后效果如下:

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/13098.html

相关文章

  • Android Studio NDK开发-环境配置

    摘要:开发环境配置全称。还提供了一份稳定的功能有限的头文件声明。以前使用做开发是件很麻烦的事情,特别是配置文件的编写。环境要求需要安装最新版的。会自动下载等开发工具。注对应环境变量的设置 Android Studio NDK开发-环境配置 NDK全称Native Development Kit。NDK是一系列Android开发工具的集合,NDK提供了一系列的工具,可以帮助开发者在Androi...

    anquan 评论0 收藏0
  • Android NDK和OpenCV整合开发 (2) Android NDK

    摘要:详细的内容可以查看文件,这个文件可能并没有列出在中我们可以从下面的表格中看出它们对语言特性的支持程度从中我们可以看出很不错,所以一般会配置为。将传递到层解析出现了乱码使用自定义的将转换成的函数,内容如下 Android NDK 和 OpenCV 整合开发 (2) Android NDK 这节主要介绍的内容是Android NDK开发的核心内容和开发总结(包括很多常见问题的解决方案),...

    yangrd 评论0 收藏0
  • Andorid Studio NDK开发- NDK开发利器gradle-experimental

    摘要:在项目主目录下的中更改配置增加的配置在中。源代码配置默认情况下,在下使用的是文件。也可以在中指定在分别指定了源代码和源代码的目录。以上的配置完成之后,就可以使用开始开发了。 使用NDK开发有件比较麻烦的事情就是编写Application.mk和Android.mk的,而Android Studio 的插件gradle-experimental就是用来解决这个这个问题的。使用gradle...

    Half 评论0 收藏0
  • AndroidStudio NDK开发最佳入门实践

    摘要:开发最佳入门实践网上一些介绍入门的教程,感觉都不是很完整和全面,也没有告诉初学的同学们一些需要注意的地方。本文所介绍的是在上搭建最佳的开发环境,给使用的开发人员最大的方便。开发最佳入门实践最后在程序中添加上加载库文件的代码。 AndroidStudio NDK开发最佳入门实践 网上一些介绍AndroidStudio NDK入门的教程,感觉都不是很完整和全面,也没有告诉初学Androi...

    macg0406 评论0 收藏0
  • AndroidStudio NDK开发最佳入门实践

    摘要:开发最佳入门实践网上一些介绍入门的教程,感觉都不是很完整和全面,也没有告诉初学的同学们一些需要注意的地方。本文所介绍的是在上搭建最佳的开发环境,给使用的开发人员最大的方便。开发最佳入门实践最后在程序中添加上加载库文件的代码。 AndroidStudio NDK开发最佳入门实践 网上一些介绍AndroidStudio NDK入门的教程,感觉都不是很完整和全面,也没有告诉初学Androi...

    e10101 评论0 收藏0

发表评论

0条评论

tomener

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<