android ndk 入门2 - 基本方法实现

2024-06-21 15:48

本文主要是介绍android ndk 入门2 - 基本方法实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 新建工程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-linux
ndk.dir=/opt/android-ndk-r10e

app/build.gradle上加入:

apply plugin: 'com.android.application'android {compileSdkVersion 23buildToolsVersion "23.0.2"defaultConfig {applicationId "com.zj.ndktest"minSdkVersion 15targetSdkVersion 23versionCode 1versionName "1.0"ndk { moduleName "hello-jni"}}buildTypes {release {minifyEnabled falseproguardFiles 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"><TextViewandroid: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;@Overrideprotected 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 __cplusplus
extern "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-jni
LOCAL_SRC_FILES := main.cpp
include ${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上加入:

    <TextViewandroid:id="@+id/text_integer_add"android:layout_width="match_parent"android:layout_height="wrap_content" /><TextViewandroid:id="@+id/text_integer_subtarct"android:layout_width="match_parent"android:layout_height="wrap_content" /><TextViewandroid:id="@+id/text_integer_multiply"android:layout_width="match_parent"android:layout_height="wrap_content" /><TextViewandroid: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;@Overrideprotected 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 __cplusplus
extern "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;
}

运行:



############################################################################################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"><TextViewandroid:id="@+id/text_view"android:layout_width="match_parent"android:layout_height="wrap_content" /><TextViewandroid:id="@+id/text_double_add"android:layout_width="match_parent"android:layout_height="wrap_content" /><TextViewandroid:id="@+id/text_double_subtarct"android:layout_width="match_parent"android:layout_height="wrap_content" /><TextViewandroid:id="@+id/text_double_multiply"android:layout_width="match_parent"android:layout_height="wrap_content" /><TextViewandroid: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;@Overrideprotected 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 __cplusplus
extern "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;
}

运行:




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


输入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"><TextViewandroid:id="@+id/text_view"android:layout_width="match_parent"android:layout_height="wrap_content" /><TextViewandroid: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;@Overrideprotected 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 __cplusplus
extern "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;
}

运行:



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


输入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"><TextViewandroid:id="@+id/text_view"android:layout_width="match_parent"android:layout_height="wrap_content" /><TextViewandroid: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;@Overrideprotected 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 __cplusplus
extern "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;
}

运行:




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


访问实例域


删除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"><TextViewandroid: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;;@Overrideprotected 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 23buildToolsVersion "23.0.2"defaultConfig {applicationId "com.zj.ndktest"minSdkVersion 15targetSdkVersion 23versionCode 1versionName "1.0"ndk {// moduleName "hello-jni"moduleName "hello-employee"}}buildTypes {release {minifyEnabled falseproguardFiles 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 __cplusplus
extern "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-employee
LOCAL_SRC_FILES := main.cpp
include ${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);
}


运行:




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


输入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"><TextViewandroid:id="@+id/text_view"android:layout_width="match_parent"android:layout_height="wrap_content" /><TextViewandroid:id="@+id/text_array_view1"android:layout_width="match_parent"android:layout_height="wrap_content" /><TextViewandroid: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;@Overrideprotected 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 23buildToolsVersion "23.0.2"defaultConfig {applicationId "com.zj.ndktest"minSdkVersion 15targetSdkVersion 23versionCode 1versionName "1.0"ndk {moduleName "hello-jni"//moduleName "hello-employee"}}buildTypes {release {minifyEnabled falseproguardFiles 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-jni
LOCAL_SRC_FILES := main.cpp
include ${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 __cplusplus
extern "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 - 基本方法实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1081651

相关文章

Android 12解决push framework.jar无法开机的方法小结

《Android12解决pushframework.jar无法开机的方法小结》:本文主要介绍在Android12中解决pushframework.jar无法开机的方法,包括编译指令、框架层和s... 目录1. android 编译指令1.1 framework层的编译指令1.2 替换framework.ja

Flutter实现文字镂空效果的详细步骤

《Flutter实现文字镂空效果的详细步骤》:本文主要介绍如何使用Flutter实现文字镂空效果,包括创建基础应用结构、实现自定义绘制器、构建UI界面以及实现颜色选择按钮等步骤,并详细解析了混合模... 目录引言实现原理开始实现步骤1:创建基础应用结构步骤2:创建主屏幕步骤3:实现自定义绘制器步骤4:构建U

SpringBoot中四种AOP实战应用场景及代码实现

《SpringBoot中四种AOP实战应用场景及代码实现》面向切面编程(AOP)是Spring框架的核心功能之一,它通过预编译和运行期动态代理实现程序功能的统一维护,在SpringBoot应用中,AO... 目录引言场景一:日志记录与性能监控业务需求实现方案使用示例扩展:MDC实现请求跟踪场景二:权限控制与

Android开发环境配置避坑指南

《Android开发环境配置避坑指南》本文主要介绍了Android开发环境配置过程中遇到的问题及解决方案,包括VPN注意事项、工具版本统一、Gerrit邮箱配置、Git拉取和提交代码、MergevsR... 目录网络环境:VPN 注意事项工具版本统一:android Studio & JDKGerrit的邮

Android实现定时任务的几种方式汇总(附源码)

《Android实现定时任务的几种方式汇总(附源码)》在Android应用中,定时任务(ScheduledTask)的需求几乎无处不在:从定时刷新数据、定时备份、定时推送通知,到夜间静默下载、循环执行... 目录一、项目介绍1. 背景与意义二、相关基础知识与系统约束三、方案一:Handler.postDel

在.NET平台使用C#为PDF添加各种类型的表单域的方法

《在.NET平台使用C#为PDF添加各种类型的表单域的方法》在日常办公系统开发中,涉及PDF处理相关的开发时,生成可填写的PDF表单是一种常见需求,与静态PDF不同,带有**表单域的文档支持用户直接在... 目录引言使用 PdfTextBoxField 添加文本输入域使用 PdfComboBoxField

SQLyog中DELIMITER执行存储过程时出现前置缩进问题的解决方法

《SQLyog中DELIMITER执行存储过程时出现前置缩进问题的解决方法》在SQLyog中执行存储过程时出现的前置缩进问题,实际上反映了SQLyog对SQL语句解析的一个特殊行为,本文给大家介绍了详... 目录问题根源正确写法示例永久解决方案为什么命令行不受影响?最佳实践建议问题根源SQLyog的语句分

Python中模块graphviz使用入门

《Python中模块graphviz使用入门》graphviz是一个用于创建和操作图形的Python库,本文主要介绍了Python中模块graphviz使用入门,具有一定的参考价值,感兴趣的可以了解一... 目录1.安装2. 基本用法2.1 输出图像格式2.2 图像style设置2.3 属性2.4 子图和聚

使用Python实现IP地址和端口状态检测与监控

《使用Python实现IP地址和端口状态检测与监控》在网络运维和服务器管理中,IP地址和端口的可用性监控是保障业务连续性的基础需求,本文将带你用Python从零打造一个高可用IP监控系统,感兴趣的小伙... 目录概述:为什么需要IP监控系统使用步骤说明1. 环境准备2. 系统部署3. 核心功能配置系统效果展

Python实现微信自动锁定工具

《Python实现微信自动锁定工具》在数字化办公时代,微信已成为职场沟通的重要工具,但临时离开时忘记锁屏可能导致敏感信息泄露,下面我们就来看看如何使用Python打造一个微信自动锁定工具吧... 目录引言:当微信隐私遇到自动化守护效果展示核心功能全景图技术亮点深度解析1. 无操作检测引擎2. 微信路径智能获