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

相关文章

SpringBoot集成redisson实现延时队列教程

《SpringBoot集成redisson实现延时队列教程》文章介绍了使用Redisson实现延迟队列的完整步骤,包括依赖导入、Redis配置、工具类封装、业务枚举定义、执行器实现、Bean创建、消费... 目录1、先给项目导入Redisson依赖2、配置redis3、创建 RedissonConfig 配

PHP轻松处理千万行数据的方法详解

《PHP轻松处理千万行数据的方法详解》说到处理大数据集,PHP通常不是第一个想到的语言,但如果你曾经需要处理数百万行数据而不让服务器崩溃或内存耗尽,你就会知道PHP用对了工具有多强大,下面小编就... 目录问题的本质php 中的数据流处理:为什么必不可少生成器:内存高效的迭代方式流量控制:避免系统过载一次性

Python的Darts库实现时间序列预测

《Python的Darts库实现时间序列预测》Darts一个集统计、机器学习与深度学习模型于一体的Python时间序列预测库,本文主要介绍了Python的Darts库实现时间序列预测,感兴趣的可以了解... 目录目录一、什么是 Darts?二、安装与基本配置安装 Darts导入基础模块三、时间序列数据结构与

Python使用FastAPI实现大文件分片上传与断点续传功能

《Python使用FastAPI实现大文件分片上传与断点续传功能》大文件直传常遇到超时、网络抖动失败、失败后只能重传的问题,分片上传+断点续传可以把大文件拆成若干小块逐个上传,并在中断后从已完成分片继... 目录一、接口设计二、服务端实现(FastAPI)2.1 运行环境2.2 目录结构建议2.3 serv

C#实现千万数据秒级导入的代码

《C#实现千万数据秒级导入的代码》在实际开发中excel导入很常见,现代社会中很容易遇到大数据处理业务,所以本文我就给大家分享一下千万数据秒级导入怎么实现,文中有详细的代码示例供大家参考,需要的朋友可... 目录前言一、数据存储二、处理逻辑优化前代码处理逻辑优化后的代码总结前言在实际开发中excel导入很

SpringBoot+RustFS 实现文件切片极速上传的实例代码

《SpringBoot+RustFS实现文件切片极速上传的实例代码》本文介绍利用SpringBoot和RustFS构建高性能文件切片上传系统,实现大文件秒传、断点续传和分片上传等功能,具有一定的参考... 目录一、为什么选择 RustFS + SpringBoot?二、环境准备与部署2.1 安装 RustF

Nginx部署HTTP/3的实现步骤

《Nginx部署HTTP/3的实现步骤》本文介绍了在Nginx中部署HTTP/3的详细步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录前提条件第一步:安装必要的依赖库第二步:获取并构建 BoringSSL第三步:获取 Nginx

MyBatis Plus实现时间字段自动填充的完整方案

《MyBatisPlus实现时间字段自动填充的完整方案》在日常开发中,我们经常需要记录数据的创建时间和更新时间,传统的做法是在每次插入或更新操作时手动设置这些时间字段,这种方式不仅繁琐,还容易遗漏,... 目录前言解决目标技术栈实现步骤1. 实体类注解配置2. 创建元数据处理器3. 服务层代码优化填充机制详

Python实现Excel批量样式修改器(附完整代码)

《Python实现Excel批量样式修改器(附完整代码)》这篇文章主要为大家详细介绍了如何使用Python实现一个Excel批量样式修改器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录前言功能特性核心功能界面特性系统要求安装说明使用指南基本操作流程高级功能技术实现核心技术栈关键函

Java实现字节字符转bcd编码

《Java实现字节字符转bcd编码》BCD是一种将十进制数字编码为二进制的表示方式,常用于数字显示和存储,本文将介绍如何在Java中实现字节字符转BCD码的过程,需要的小伙伴可以了解下... 目录前言BCD码是什么Java实现字节转bcd编码方法补充总结前言BCD码(Binary-Coded Decima