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十分简单,开发时只需要把精力集中在代码逻辑上,不用去做繁琐的设置。期待正式版本的到来.

原文地址:https://www.cnblogs.com/sun-yang-/p/5207810.html