新建工程NDKTest,新建一个空Activity

新建java类MyNDK.java:

package com.zj.ndktest;/** * Created by root on 15-11-25. */public class MyNDK {    static {        System.loadLibrary("hello-jni");    }    public static native String Hello();}

local.properties上加入:

sdk.dir=/opt/android-sdk-linuxndk.dir=/opt/android-ndk-r10e

app/build.gradle上加入:

apply plugin: 'com.android.application'android {    compileSdkVersion 23    buildToolsVersion "23.0.2"    defaultConfig {        applicationId "com.zj.ndktest"        minSdkVersion 15        targetSdkVersion 23        versionCode 1        versionName "1.0"        ndk {             moduleName "hello-jni"        }    }    buildTypes {        release {            minifyEnabled false            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'        }    }}dependencies {    compile fileTree(dir: 'libs', include: ['*.jar'])    testCompile 'junit:junit:4.12'    compile 'com.android.support:appcompat-v7:23.1.0'}

activity_main.xml:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical">    <TextView        android:id="@+id/text_view"        android:layout_width="match_parent"        android:layout_height="wrap_content" /></LinearLayout>

MainActivity.java:

package com.zj.ndktest;import android.app.Activity;import android.os.Bundle;import android.view.Window;import android.widget.TextView;public class MainActivity extends Activity {    private TextView mTextView;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        requestWindowFeature(Window.FEATURE_NO_TITLE);        setContentView(R.layout.activity_main);        mTextView = (TextView)findViewById(R.id.text_view);        mTextView.setText(MyNDK.Hello());    }}

点击MyNDK.java文件,右键点击External Tools->javah(没有的请查看android ndk 入门 - 一个简单的ndk工程)

生成app/src/main/jni/com_zj_ndktest_MyNDK.h

/* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* Header for class com_zj_ndktest_MyNDK */#ifndef _Included_com_zj_ndktest_MyNDK#define _Included_com_zj_ndktest_MyNDK#ifdef __cplusplusextern "C" {#endif/* * Class:     com_zj_ndktest_MyNDK * Method:    Hello * Signature: ()Ljava/lang/String; */JNIEXPORT jstring JNICALL Java_com_zj_ndktest_MyNDK_Hello  (JNIEnv *, jclass);#ifdef __cplusplus}#endif#endif

新建jni/Android.mk:

LOCAL_PATH := ${call my-dir}include $(CLEAR_VARS)LOCAL_MODULE := hello-jniLOCAL_SRC_FILES := main.cppinclude ${BUILD_SHARED_LIBRARY}

新建main.cpp:

#include <jni.h>#include "com_zj_ndktest_MyNDK.h"JNIEXPORT jstring JNICALL Java_com_zj_ndktest_MyNDK_Hello        (JNIEnv *env, jclass cla) {    return env->NewStringUTF("Hello JNI");}

运行,即可完成简单的ndk程序


####################################################################


实现int输入,int输出

在MyNDK.java上加入:

    public static native int HelloIntegerAdd(int a, int b);    public static native int HelloIntegerSubtract(int a, int b);    public static native int HelloIntegerMultiply(int a, int b);    public static native int HelloIntegerDivide(int a, int b);

在activity_main.xml上加入:

    <TextView        android:id="@+id/text_integer_add"        android:layout_width="match_parent"        android:layout_height="wrap_content" />    <TextView        android:id="@+id/text_integer_subtarct"        android:layout_width="match_parent"        android:layout_height="wrap_content" />    <TextView        android:id="@+id/text_integer_multiply"        android:layout_width="match_parent"        android:layout_height="wrap_content" />    <TextView        android:id="@+id/text_integer_divide"        android:layout_width="match_parent"        android:layout_height="wrap_content" />

在MainActivity上加入:

package com.zj.ndktest;import android.app.Activity;import android.os.Bundle;import android.view.Window;import android.widget.TextView;public class MainActivity extends Activity {    private TextView mTextView;    private TextView mTextIntegerAdd;    private TextView mTextIntegerSubtract;    private TextView mTextIntegerMultiply;    private TextView mTextIntegerDivide;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        requestWindowFeature(Window.FEATURE_NO_TITLE);        setContentView(R.layout.activity_main);        mTextView = (TextView)findViewById(R.id.text_view);        mTextView.setText(MyNDK.Hello());        StringBuffer text_integer_add = new StringBuffer("3 + 5 =");        text_integer_add.append(MyNDK.HelloIntegerAdd(3, 5));        mTextIntegerAdd = (TextView)findViewById(R.id.text_integer_add);        mTextIntegerAdd.setText(text_integer_add.toString());        StringBuffer text_integer_subtract = new StringBuffer("33 - 100 = ");        text_integer_subtract.append(MyNDK.HelloIntegerSubtract(33, 100));        mTextIntegerSubtract = (TextView)findViewById(R.id.text_integer_subtarct);        mTextIntegerSubtract.setText(text_integer_subtract.toString());        StringBuffer text_integer_multiply = new StringBuffer("6 * 23 = ");        text_integer_multiply.append(MyNDK.HelloIntegerMultiply(6, 23));        mTextIntegerMultiply = (TextView)findViewById(R.id.text_integer_multiply);        mTextIntegerMultiply.setText(text_integer_multiply.toString());        StringBuffer text_integer_divide = new StringBuffer("90 / 32 = ");        text_integer_divide.append(MyNDK.HelloIntegerDivide(90, 32));        mTextIntegerDivide = (TextView)findViewById(R.id.text_integer_divide);        mTextIntegerDivide.setText(text_integer_divide.toString());    }}

点击MyNDK.java,右键->External Tools->javah

生成新的com_zj_ndktest_MyNDK.h:

/* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* Header for class com_zj_ndktest_MyNDK */#ifndef _Included_com_zj_ndktest_MyNDK#define _Included_com_zj_ndktest_MyNDK#ifdef __cplusplusextern "C" {#endif/* * Class:     com_zj_ndktest_MyNDK * Method:    Hello * Signature: ()Ljava/lang/String; */JNIEXPORT jstring JNICALL Java_com_zj_ndktest_MyNDK_Hello  (JNIEnv *, jclass);/* * Class:     com_zj_ndktest_MyNDK * Method:    HelloIntegerAdd * Signature: (II)I */JNIEXPORT jint JNICALL Java_com_zj_ndktest_MyNDK_HelloIntegerAdd  (JNIEnv *, jclass, jint, jint);/* * Class:     com_zj_ndktest_MyNDK * Method:    HelloIntegerSubtract * Signature: (II)I */JNIEXPORT jint JNICALL Java_com_zj_ndktest_MyNDK_HelloIntegerSubtract  (JNIEnv *, jclass, jint, jint);/* * Class:     com_zj_ndktest_MyNDK * Method:    HelloIntegerMultiply * Signature: (II)I */JNIEXPORT jint JNICALL Java_com_zj_ndktest_MyNDK_HelloIntegerMultiply  (JNIEnv *, jclass, jint, jint);/* * Class:     com_zj_ndktest_MyNDK * Method:    HelloIntegerDivide * Signature: (II)I */JNIEXPORT jint JNICALL Java_com_zj_ndktest_MyNDK_HelloIntegerDivide  (JNIEnv *, jclass, jint, jint);#ifdef __cplusplus}#endif#endif

main.cpp修改为:

#include <jni.h>#include "com_zj_ndktest_MyNDK.h"JNIEXPORT jstring JNICALL Java_com_zj_ndktest_MyNDK_Hello        (JNIEnv *env, jclass cla) {    return env->NewStringUTF("Hello JNI");}/* * Class:     com_zj_ndktest_MyNDK * Method:    HelloIntegerAdd * Signature: (II)I */JNIEXPORT jint JNICALL Java_com_zj_ndktest_MyNDK_HelloIntegerAdd        (JNIEnv *env, jclass cla, jint a, jint b) {    jint c;    c = a + b;    return c;}/* * Class:     com_zj_ndktest_MyNDK * Method:    HelloIntegerSubtract * Signature: (II)I */JNIEXPORT jint JNICALL Java_com_zj_ndktest_MyNDK_HelloIntegerSubtract        (JNIEnv *env, jclass cla, jint a, jint b) {    jint c;    c = a - b;    return c;}/* * Class:     com_zj_ndktest_MyNDK * Method:    HelloIntegerMultiply * Signature: (II)I */JNIEXPORT jint JNICALL Java_com_zj_ndktest_MyNDK_HelloIntegerMultiply        (JNIEnv *env, jclass cla, jint a, jint b) {    jint c;    c = a * b;    return c;}/* * Class:     com_zj_ndktest_MyNDK * Method:    HelloIntegerDivide * Signature: (II)I */JNIEXPORT jint JNICALL Java_com_zj_ndktest_MyNDK_HelloIntegerDivide        (JNIEnv *env, jclass cla, jint a, jint b) {    jint c;    c = a / b;    return c;}

运行:

android ndk 入门2 - 基本方法实现_第1张图片


############################################################################################3


实现double输入,double输出


修改MyNDK.java如下:

package com.zj.ndktest;/** * Created by root on 15-11-25. */public class MyNDK {    static {        System.loadLibrary("hello-jni");    }    public static native String Hello();    public static native double HelloDoubleAdd(double a, double b);    public static native double HelloDoubleSubtract(double a, double b);    public static native double HelloDoubleMultiply(double a, double b);    public static native double HelloDoubleDivide(double a, double b);}

修改activity_main.xml如下:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical">    <TextView        android:id="@+id/text_view"        android:layout_width="match_parent"        android:layout_height="wrap_content" />    <TextView        android:id="@+id/text_double_add"        android:layout_width="match_parent"        android:layout_height="wrap_content" />    <TextView        android:id="@+id/text_double_subtarct"        android:layout_width="match_parent"        android:layout_height="wrap_content" />    <TextView        android:id="@+id/text_double_multiply"        android:layout_width="match_parent"        android:layout_height="wrap_content" />    <TextView        android:id="@+id/text_double_divide"        android:layout_width="match_parent"        android:layout_height="wrap_content" /></LinearLayout>

修改MainActivity.java如下:

package com.zj.ndktest;import android.app.Activity;import android.os.Bundle;import android.view.Window;import android.widget.TextView;public class MainActivity extends Activity {    private TextView mTextView;    private TextView mTextDoubleAdd;    private TextView mTextDoubleSubtract;    private TextView mTextDoubleMultiply;    private TextView mTextDoubleDivide;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        requestWindowFeature(Window.FEATURE_NO_TITLE);        setContentView(R.layout.activity_main);        mTextView = (TextView)findViewById(R.id.text_view);        mTextView.setText(MyNDK.Hello());        StringBuffer text_double_add = new StringBuffer("3.0 + 5.0 =");        text_double_add.append(MyNDK.HelloDoubleAdd(3.0, 5.0));        mTextDoubleAdd = (TextView)findViewById(R.id.text_double_add);        mTextDoubleAdd.setText(text_double_add.toString());        StringBuffer text_double_subtract = new StringBuffer("33.0 - 100.0 = ");        text_double_subtract.append(MyNDK.HelloDoubleSubtract(33.0, 100.0));        mTextDoubleSubtract = (TextView)findViewById(R.id.text_double_subtarct);        mTextDoubleSubtract.setText(text_double_subtract.toString());        StringBuffer text_double_multiply = new StringBuffer("6.0 * 23.0 = ");        text_double_multiply.append(MyNDK.HelloDoubleMultiply(6.0, 23.0));        mTextDoubleMultiply = (TextView)findViewById(R.id.text_double_multiply);        mTextDoubleMultiply.setText(text_double_multiply.toString());        StringBuffer text_double_divide = new StringBuffer("90.0 / 32.0 = ");        text_double_divide.append(MyNDK.HelloDoubleDivide(90.0, 32.0));        mTextDoubleDivide = (TextView)findViewById(R.id.text_double_divide);        mTextDoubleDivide.setText(text_double_divide.toString());    }}

点击MyNDK.java,右键->External Tools->javah,生成新的com_zj_ndktest_MyNDK.h:

/* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* Header for class com_zj_ndktest_MyNDK */#ifndef _Included_com_zj_ndktest_MyNDK#define _Included_com_zj_ndktest_MyNDK#ifdef __cplusplusextern "C" {#endif/* * Class:     com_zj_ndktest_MyNDK * Method:    Hello * Signature: ()Ljava/lang/String; */JNIEXPORT jstring JNICALL Java_com_zj_ndktest_MyNDK_Hello  (JNIEnv *, jclass);/* * Class:     com_zj_ndktest_MyNDK * Method:    HelloDoubleAdd * Signature: (DD)D */JNIEXPORT jdouble JNICALL Java_com_zj_ndktest_MyNDK_HelloDoubleAdd  (JNIEnv *, jclass, jdouble, jdouble);/* * Class:     com_zj_ndktest_MyNDK * Method:    HelloDoubleSubtract * Signature: (DD)D */JNIEXPORT jdouble JNICALL Java_com_zj_ndktest_MyNDK_HelloDoubleSubtract  (JNIEnv *, jclass, jdouble, jdouble);/* * Class:     com_zj_ndktest_MyNDK * Method:    HelloDoubleMultiply * Signature: (DD)D */JNIEXPORT jdouble JNICALL Java_com_zj_ndktest_MyNDK_HelloDoubleMultiply  (JNIEnv *, jclass, jdouble, jdouble);/* * Class:     com_zj_ndktest_MyNDK * Method:    HelloDoubleDivide * Signature: (DD)D */JNIEXPORT jdouble JNICALL Java_com_zj_ndktest_MyNDK_HelloDoubleDivide  (JNIEnv *, jclass, jdouble, jdouble);#ifdef __cplusplus}#endif#endif

修改main.cpp如下:

#include <jni.h>#include "com_zj_ndktest_MyNDK.h"JNIEXPORT jstring JNICALL Java_com_zj_ndktest_MyNDK_Hello        (JNIEnv *env, jclass cla) {    return env->NewStringUTF("Hello JNI");}/* * Class:     com_zj_ndktest_MyNDK * Method:    HelloDoubleAdd * Signature: (DD)D */JNIEXPORT jdouble JNICALL Java_com_zj_ndktest_MyNDK_HelloDoubleAdd        (JNIEnv *env, jclass cla, jdouble a, jdouble b) {    jdouble c;    c = a + b;    return c;}/* * Class:     com_zj_ndktest_MyNDK * Method:    HelloDoubleSubtract * Signature: (DD)D */JNIEXPORT jdouble JNICALL Java_com_zj_ndktest_MyNDK_HelloDoubleSubtract        (JNIEnv *env, jclass cla, jdouble a, jdouble b) {    jdouble c;    c = a - b;    return c;}/* * Class:     com_zj_ndktest_MyNDK * Method:    HelloDoubleMultiply * Signature: (DD)D */JNIEXPORT jdouble JNICALL Java_com_zj_ndktest_MyNDK_HelloDoubleMultiply        (JNIEnv *env, jclass cla, jdouble a, jdouble b) {    jdouble c;    c = a * b;    return c;}/* * Class:     com_zj_ndktest_MyNDK * Method:    HelloDoubleDivide * Signature: (DD)D */JNIEXPORT jdouble JNICALL Java_com_zj_ndktest_MyNDK_HelloDoubleDivide        (JNIEnv *env, jclass cla, jdouble a, jdouble b) {    jdouble c;    c = a / b;    return c;}

运行:

android ndk 入门2 - 基本方法实现_第2张图片



###################################################################


输入boolean,输出boolean


修改MyNDK.java如下:

package com.zj.ndktest;/** * Created by root on 15-11-25. */public class MyNDK {    static {        System.loadLibrary("hello-jni");    }    public static native String Hello();    public static native boolean HelloBoolean(boolean b);}

修改activity_main.xml如下:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical">    <TextView        android:id="@+id/text_view"        android:layout_width="match_parent"        android:layout_height="wrap_content" />    <TextView        android:id="@+id/text_boolean_view"        android:layout_width="match_parent"        android:layout_height="wrap_content" /></LinearLayout>

修改MainActivity.java如下:

package com.zj.ndktest;import android.app.Activity;import android.os.Bundle;import android.view.Window;import android.widget.TextView;public class MainActivity extends Activity {    private TextView mTextView;    private TextView mTextBoolean;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        requestWindowFeature(Window.FEATURE_NO_TITLE);        setContentView(R.layout.activity_main);        mTextView = (TextView)findViewById(R.id.text_view);        mTextView.setText(MyNDK.Hello());        StringBuffer text_boolean = new StringBuffer("True = ");        text_boolean.append(MyNDK.HelloBoolean(true));        mTextBoolean = (TextView)findViewById(R.id.text_view);        mTextBoolean.setText(text_boolean.toString());    }}

点击MyNDK.java,右键->External Tools->javah,生成com_zj_ndktest_MyNDK.h:

/* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* Header for class com_zj_ndktest_MyNDK */#ifndef _Included_com_zj_ndktest_MyNDK#define _Included_com_zj_ndktest_MyNDK#ifdef __cplusplusextern "C" {#endif/* * Class:     com_zj_ndktest_MyNDK * Method:    Hello * Signature: ()Ljava/lang/String; */JNIEXPORT jstring JNICALL Java_com_zj_ndktest_MyNDK_Hello  (JNIEnv *, jclass);/* * Class:     com_zj_ndktest_MyNDK * Method:    HelloBoolean * Signature: (Z)Z */JNIEXPORT jboolean JNICALL Java_com_zj_ndktest_MyNDK_HelloBoolean  (JNIEnv *, jclass, jboolean);#ifdef __cplusplus}#endif#endif

修改main.cpp如下:

#include <jni.h>#include "com_zj_ndktest_MyNDK.h"JNIEXPORT jstring JNICALL Java_com_zj_ndktest_MyNDK_Hello        (JNIEnv *env, jclass cla) {    return env->NewStringUTF("Hello JNI");}JNIEXPORT jboolean JNICALL Java_com_zj_ndktest_MyNDK_HelloBoolean        (JNIEnv *env, jclass cla, jboolean b) {    jboolean res = JNI_FALSE;    if (b == JNI_TRUE) {        res = JNI_TRUE;    } else {        res = JNI_FALSE;    }    return res;}

运行:

android ndk 入门2 - 基本方法实现_第3张图片


##################################################################################


输入jstring,double,输出jstring


修改MyNDK.java:

package com.zj.ndktest;/** * Created by root on 15-11-25. */public class MyNDK {    static {        System.loadLibrary("hello-jni");    }    public static native String Hello();    public static native String sprint(String format, double x);}

修改activity_main.xml:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical">    <TextView        android:id="@+id/text_view"        android:layout_width="match_parent"        android:layout_height="wrap_content" />    <TextView        android:id="@+id/text_string_view"        android:layout_width="match_parent"        android:layout_height="wrap_content" /></LinearLayout>

修改MainActivity.java:

package com.zj.ndktest;import android.app.Activity;import android.os.Bundle;import android.view.Window;import android.widget.TextView;public class MainActivity extends Activity {    private TextView mTextView;    private TextView mTextString;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        requestWindowFeature(Window.FEATURE_NO_TITLE);        setContentView(R.layout.activity_main);        mTextView = (TextView)findViewById(R.id.text_view);        mTextView.setText(MyNDK.Hello());        mTextString = (TextView)findViewById(R.id.text_string_view);        mTextString.setText(MyNDK.sprint("Amount due = %8.2f", 33.4556));    }}

点击MyNDK.java,右键->External Tools->javah,生成com_zj_ndktest_MyNDK.h:

/* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* Header for class com_zj_ndktest_MyNDK */#ifndef _Included_com_zj_ndktest_MyNDK#define _Included_com_zj_ndktest_MyNDK#ifdef __cplusplusextern "C" {#endif/* * Class:     com_zj_ndktest_MyNDK * Method:    Hello * Signature: ()Ljava/lang/String; */JNIEXPORT jstring JNICALL Java_com_zj_ndktest_MyNDK_Hello  (JNIEnv *, jclass);/* * Class:     com_zj_ndktest_MyNDK * Method:    sprint * Signature: (Ljava/lang/String;D)Ljava/lang/String; */JNIEXPORT jstring JNICALL Java_com_zj_ndktest_MyNDK_sprint  (JNIEnv *, jclass, jstring, jdouble);#ifdef __cplusplus}#endif#endif

修改main.cpp如下:

#include <jni.h>#include <stdlib.h>#include <stdio.h>#include "com_zj_ndktest_MyNDK.h"JNIEXPORT jstring JNICALL Java_com_zj_ndktest_MyNDK_Hello        (JNIEnv *env, jclass cla) {    return env->NewStringUTF("Hello JNI");}JNIEXPORT jstring JNICALL Java_com_zj_ndktest_MyNDK_sprint        (JNIEnv *env, jclass cla, jstring format, jdouble x) {    const char* cformat;    jstring ret;    cformat = env->GetStringUTFChars(format, NULL);    char *cret;    cret = (char*)malloc(strlen(cformat)+8);    sprintf(cret, cformat, x);    ret = env->NewStringUTF(cret);    free(cret);    env->ReleaseStringUTFChars(format, cformat);    return ret;}

运行:

android ndk 入门2 - 基本方法实现_第4张图片



#############################################################


访问实例域


删除MyNDK.java文件,新建Employee.java文件:

package com.zj.ndktest;/** * Created by root on 15-11-25. */public class Employee {    static {        System.loadLibrary("hello-employee");    }    private String name;    private double salary;    public Employee(String n, double s) {        name = n;        salary = s;    }    public native void raiseSalary(double byPercent);    public String print() {        StringBuffer sb = new StringBuffer();        sb.append(name);        sb.append(" ");        sb.append(salary);        return sb.toString();    }}

修改activity_main.xml:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical">    <TextView        android:id="@+id/text_instance_view"        android:layout_width="match_parent"        android:layout_height="wrap_content" /></LinearLayout>

修改MainAcitvity.java:

package com.zj.ndktest;import android.app.Activity;import android.os.Bundle;import android.view.Window;import android.widget.TextView;public class MainActivity extends Activity {    private TextView mTextInstance;;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        requestWindowFeature(Window.FEATURE_NO_TITLE);        setContentView(R.layout.activity_main);        Employee em = new Employee("hello world", 32000);        em.raiseSalary(5);        mTextInstance = (TextView)findViewById(R.id.text_instance_view);        mTextInstance.setText(em.print());    }}

修改app/build.gradle:

apply plugin: 'com.android.application'android {    compileSdkVersion 23    buildToolsVersion "23.0.2"    defaultConfig {        applicationId "com.zj.ndktest"        minSdkVersion 15        targetSdkVersion 23        versionCode 1        versionName "1.0"        ndk {            // moduleName "hello-jni"            moduleName "hello-employee"        }    }    buildTypes {        release {            minifyEnabled false            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'        }    }}dependencies {    compile fileTree(dir: 'libs', include: ['*.jar'])    testCompile 'junit:junit:4.12'    compile 'com.android.support:appcompat-v7:23.1.0'}

点击Employee.java,右键->Extrenal Tools->javah,生成com_zj_ndktest_Employee.h:
/* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* Header for class com_zj_ndktest_Employee */#ifndef _Included_com_zj_ndktest_Employee#define _Included_com_zj_ndktest_Employee#ifdef __cplusplusextern "C" {#endif/* * Class:     com_zj_ndktest_Employee * Method:    raiseSalary * Signature: (D)V */JNIEXPORT void JNICALL Java_com_zj_ndktest_Employee_raiseSalary  (JNIEnv *, jobject, jdouble);#ifdef __cplusplus}#endif#endif

修改Android.mk:

LOCAL_PATH := ${call my-dir}include $(CLEAR_VARS)LOCAL_MODULE := hello-employeeLOCAL_SRC_FILES := main.cppinclude ${BUILD_SHARED_LIBRARY}

修改main.cpp:

#include <jni.h>#include <stdlib.h>#include <stdio.h>#include "com_zj_ndktest_Employee.h"JNIEXPORT void JNICALL Java_com_zj_ndktest_Employee_raiseSalary        (JNIEnv *env, jobject obj, jdouble byPercent) {    /* get the class */    jclass class_Employee = env->GetObjectClass(obj);    /* get the field ID */    jfieldID id_salary = env->GetFieldID(class_Employee, "salary", "D");    /* get the field value */    jdouble salary = env->GetDoubleField(obj, id_salary);    salary *= 1 + byPercent / 100;    /* set the field value */    env->SetDoubleField(obj, id_salary, salary);}


运行:

android ndk 入门2 - 基本方法实现_第5张图片



######################################################################################


输入double数组,输出double数组


删除Employee.java,新建MyNDK.java:

package com.zj.ndktest;/** * Created by root on 15-11-25. */public class MyNDK {    static {        System.loadLibrary("hello-jni");    }    public static native String Hello();    public native double[] HelloDoubleArray(double[] arr);    public String print(double[] arr) {        StringBuffer sb = new StringBuffer();        for(double dou : arr) {            sb.append(dou);            sb.append(" ");        }        return sb.toString();    }}

修改activity_main.xml:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical">    <TextView        android:id="@+id/text_view"        android:layout_width="match_parent"        android:layout_height="wrap_content" />    <TextView        android:id="@+id/text_array_view1"        android:layout_width="match_parent"        android:layout_height="wrap_content" />    <TextView        android:id="@+id/text_array_view2"        android:layout_width="match_parent"        android:layout_height="wrap_content" /></LinearLayout>

修改MainActivity.java:

package com.zj.ndktest;import android.app.Activity;import android.os.Bundle;import android.view.Window;import android.widget.TextView;public class MainActivity extends Activity {    private TextView mTextView;    private TextView mTextArray1;    private TextView mTextArray2;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        requestWindowFeature(Window.FEATURE_NO_TITLE);        setContentView(R.layout.activity_main);        mTextView = (TextView)findViewById(R.id.text_view);        mTextView.setText(MyNDK.Hello());        double[] arr = new double[]{1,2,3,4};        MyNDK my = new MyNDK();        mTextArray1 = (TextView)findViewById(R.id.text_array_view1);        mTextArray1.setText(my.print(arr));        double[] arr2 = my.HelloDoubleArray(arr);        mTextArray2 = (TextView)findViewById(R.id.text_array_view2);        mTextArray2.setText(my.print(arr2));    }}

修改app/build.gradle:

apply plugin: 'com.android.application'android {    compileSdkVersion 23    buildToolsVersion "23.0.2"    defaultConfig {        applicationId "com.zj.ndktest"        minSdkVersion 15        targetSdkVersion 23        versionCode 1        versionName "1.0"        ndk {             moduleName "hello-jni"            //moduleName "hello-employee"        }    }    buildTypes {        release {            minifyEnabled false            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'        }    }}dependencies {    compile fileTree(dir: 'libs', include: ['*.jar'])    testCompile 'junit:junit:4.12'    compile 'com.android.support:appcompat-v7:23.1.0'}

修改Android.mk:

LOCAL_PATH := ${call my-dir}include $(CLEAR_VARS)LOCAL_MODULE := hello-jniLOCAL_SRC_FILES := main.cppinclude ${BUILD_SHARED_LIBRARY}

点击MyNDK,右键->External Tools->javah,生成com_zj_ndktest_MyNDk.h:

/* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* Header for class com_zj_ndktest_MyNDK */#ifndef _Included_com_zj_ndktest_MyNDK#define _Included_com_zj_ndktest_MyNDK#ifdef __cplusplusextern "C" {#endif/* * Class:     com_zj_ndktest_MyNDK * Method:    Hello * Signature: ()Ljava/lang/String; */JNIEXPORT jstring JNICALL Java_com_zj_ndktest_MyNDK_Hello  (JNIEnv *, jclass);/* * Class:     com_zj_ndktest_MyNDK * Method:    HelloDoubleArray * Signature: ([D)[D */JNIEXPORT jdoubleArray JNICALL Java_com_zj_ndktest_MyNDK_HelloDoubleArray  (JNIEnv *, jobject, jdoubleArray);#ifdef __cplusplus}#endif#endif

修改main.cpp:

#include <jni.h>#include <stdlib.h>#include <stdio.h>#include "com_zj_ndktest_Employee.h"extern "C" {/* * Class:     com_zj_ndktest_MyNDK * Method:    Hello * Signature: ()Ljava/lang/String; */JNIEXPORT jstring JNICALL Java_com_zj_ndktest_MyNDK_Hello        (JNIEnv *env, jclass cla) {    return env->NewStringUTF("hello world");}/* * Class:     com_zj_ndktest_MyNDK * Method:    HelloDoubleArray * Signature: ([D)[D */JNIEXPORT jdoubleArray JNICALL Java_com_zj_ndktest_MyNDK_HelloDoubleArray        (JNIEnv *env, jobject obj, jdoubleArray dou) {        jsize leng = env->GetArrayLength(dou);        jdoubleArray arr = env->NewDoubleArray(leng);        double *a = env->GetDoubleArrayElements(arr, NULL);        double *d = env->GetDoubleArrayElements(dou, NULL);        for (int i = 0; i < leng; i++) {            a[i] = d[i] * 2;        }        env->ReleaseDoubleArrayElements(dou, d, NULL);        env->ReleaseDoubleArrayElements(arr, a, NULL);        return arr;    }}

运行:

android ndk 入门2 - 基本方法实现_第6张图片


更多相关文章

  1. Android之OnGestureListener实现图片的左右滑动
  2. Android中获得上下文的静态方法
  3. Android 打开浏览器的几种方法
  4. 图片压缩保存读取操作
  5. Unity调用Android配置方法
  6. Android基础入门教程——1.2.2 使用Android Studio开发Android A
  7. Android 滑动手势侦测方法介绍
  8. Android 圆角图片,基于Glide4.9 的 BitmapTransformation,可任意设
  9. 安卓selector使用方法

随机推荐

  1. Android(安卓)9.0 电源管理之省电模式
  2. 解决下载Android4.0源码时遇到的问题
  3. Android(安卓)项目上线流程总结
  4. android 模块之桌面闹钟
  5. android 安全讲座第二层 使用AndBug调试A
  6. 详解如何将android工具链作为独立编译器
  7. Android(安卓)内置浏览器
  8. 在Android(安卓)Studio 中加入jar 和.so
  9. 【Android】学习笔记(4)――基本控件之Pr
  10. 捕获Android文本中链接点击事件