zoukankan      html  css  js  c++  java
  • android ndk 环境搭建和简单实例

    先介绍下我的软件环境

    android studio 1.5

    ndk r10e,

    gradle-experimental:0.6.0-beta5 (top-level build.gradle)

    gradle-2.10-all.zip(gradle/wrapper/gradle-wrapper.properties)

    app.gradle,红色字体为修改部分

    apply plugin: 'com.android.model.application'
    
    model{
        android {
            compileSdkVersion=23
            buildToolsVersion="23.0.1"
    
            defaultConfig {
                applicationId "com.example.user.myapplication"
                minSdkVersion.apiLevel 14
                targetSdkVersion.apiLevel 23
                versionCode 1
                versionName "1.0"
            }
    
            ndk {
                moduleName "HelloNDK"
            }
    
            buildTypes {
                release {
                    minifyEnabled false
                    proguardFiles.add(file("proguard-rules.pro"))
                }
            }
    
            // Configures source set directory.
            sources {
                main {
                    java {
                        source {
                            srcDir "src"
                        }
                    }
                }
            }
        }
    }
    
    dependencies {
        compile fileTree(include: ['*.jar'], dir: 'libs')
        compile 'com.android.support:appcompat-v7:23.1.1'
    }

    还需要在local.properties文件中设置ndk路径,如下,具体路径根据你安装的ndk路径而定

    ndk.dir=C:\Users\Administrator\AppData\Local\Android\Ndk\android-ndk-r10e
    sdk.dir=C:\Users\Administrator\AppData\Local\Android\Sdk

    也可以右键项目名称,选择open modules setting(F4),然后选择SDK Location项,然后设置android NDK Location项的值,效果是一样的。

    然后main右键——New——folder——JNI Folder添加jni文件夹,所有.c/.c++文件都应该放到此处.当前版本的NDK有bug,所以需要先在这个文件夹内生产一个空的c文件,

    jni文件夹右键——New——C/C++ Source File——Name栏可以任意输入,type栏选择文件类型,然后ok确认之后自动生成.c和.h文件,不需要改动内容.

    至此环境已经搭建完成。

    然后是测试例子,这里在MainActivity中测试

    public class MainActivity extends AppCompatActivity {
    
        static {
            System.loadLibrary("HelloNDK");
        }
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            TextView tv = (TextView) findViewById(R.id.tv);
            tv.setText(this.get());
        }
    
        public native String get();
    
        public native void set(String str);
    }

    onCreate就是用一个文本框来显示从C方法里面返回的值。关键点在红色字体部分,其中System.loadLibrary("HelloNDK")是用来加载C库,public native String get();public native void set(String str);两个方法则是声明C库里面有这2个方法.当然现在jni文件夹里面并没有HelloNDK.c这个文件,所以会提示错误,这时只要选中方法名,然后alt+enter,然后选择Create funcation XXX,就会在jni文件夹中自动生成HelloNDK.c文件,该文件里面会自动生成符合jni规则的对应C方法,然后只需要实现该方法体,就完成了简单的ndk实例.

    HelloNDK.c文件内容如下,红色字体为手动修改部分,其余部分均为自动生成

    #include <jni.h>
    
    JNIEXPORT jstring JNICALL
    Java_main_java_com_sunyang_ndkapplication_MainActivity_get(JNIEnv *env, jobject instance) {
    
        // TODO
    
    
        return (*env)->NewStringUTF(env, "hello ndk");
    }
    
    JNIEXPORT void JNICALL
    Java_main_java_com_sunyang_ndkapplication_MainActivity_set(JNIEnv *env, jobject instance,
                                                               jstring str_) {
        const char *str = (*env)->GetStringUTFChars(env, str_, 0);
    
        // TODO
    
        (*env)->ReleaseStringUTFChars(env, str_, str);
    }

    完成之后运行,手机界面上的TextView应该会显示hello ndk.

    至此环境搭建和实例测试结束从使用体验上来看,使用NDK来调用jni十分简单,开发时只需要把精力集中在代码逻辑上,不用去做繁琐的设置。期待正式版本的到来.

  • 相关阅读:
    Arr
    class4
    class3联大网页
    class33
    class3
    人机交换 NO 1书签
    大数据的框架与特点
    mapreduce排序
    mapreduce求平均数
    mapreduce去重
  • 原文地址:https://www.cnblogs.com/sun-yang-/p/5207810.html
Copyright © 2011-2022 走看看