固然事前必定要先配好環境;java
下面來講步驟:android
1. 在代碼裏寫入要調用的native方法:app
String getData(); String getData2();
2. 動態連接庫;ide
System.loadLibrary("ndktest")gradle
3. 在build.gradle文件中 加入ndk{...}代碼:ui
defaultConfig { applicationId "com.hong.ndktest" minSdkVersion 19 targetSdkVersion 23 versionCode 1 versionName "1.0" ndk{ moduleName "ndktest" abiFilters "armeabi", "armeabi-v7a", "x86" } }
4. 在main目錄下建立 jni 文件夾;spa
5. 在jni 文件夾裏面建立 .c 文件:.net
6. 用javah生成c的頭文件
a,控制檯先進入工程的目錄下 項目路徑\AndroidStudioProjects\NDKDemo\ndkdemo2\src\main>
b,執行下面命令:
javah -d jni -classpath D:\AndroidStudio\sdk\platforms\android-23\android.jar;..\..\build\intermediates\classes\debug yourPackageName.MainActivity
debug
(註釋: 紅字 23 這裏要根據你build.gradle文件中的 tartgetSdkVersion 更改);code
當回車以後沒有反應 就成功了,在jni文件夾裏能夠看到生成的頭文件(在第5步的圖片中" com_hong_ndktest_MainActivity.h" 即是生成的頭文件)
7. 生成頭文件成功後,會在 build\intermediates\ndk\debug 中生成 .mk 文件。打開頭文件,裏面有 對應的 native 方法(方法簽名都省了):
/* * Class: com_hong_ndktest_MainActivity * Method: getData * Signature: ()Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_com_hong_ndktest_MainActivity_getData (JNIEnv *, jobject); /* * Class: com_hong_ndktest_MainActivity * Method: getData2 * Signature: ()Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_com_hong_ndktest_MainActivity_getData2 (JNIEnv *, jobject);
8. 把對應的方法黏貼到 .c 文件中,並填寫邏輯代碼,不要忘了把include<>也黏貼過去:
// // Created by Hong on 2016/3/30. // /* DO NOT EDIT THIS FILE - it is machine generated */ #include <jni.h> /* Header for class com_hong_ndktest_MainActivity */ #define _Included_com_hong_ndktest_MainActivity /* * Class: com_hong_ndktest_MainActivity * Method: getData * Signature: ()Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_com_hong_ndktest_MainActivity_getData (JNIEnv * env, jobject jobj) { return (*env)->NewStringUTF(env, "from C"); } /* * Class: com_hong_ndktest_MainActivity * Method: getData2 * Signature: ()Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_com_hong_ndktest_MainActivity_getData2 (JNIEnv *env, jobject jobj) { return (*env)->NewStringUTF(env, "fromCgetData2"); }
9. 在 java 端能夠調用 c 了;
==================================分割線就是我可恨=======================
下面粘貼源碼:
MainActivity;
package com.hong.ndktest; import android.app.Activity; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.TextView; public class MainActivity extends Activity { TextView tv_show; { System.loadLibrary("ndktest");//加載庫 } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tv_show = (TextView) findViewById(R.id.tv_show); } /* * button 點擊事件 */ public void show(View view) { String data = getData()+"===="+getData2();//調用native方法 tv_show.setText(data); } //聲明native方法 public native String getData(); public native String getData2(); }
TestJNI.c
#include <jni.h> #define _Included_com_hong_ndktest_MainActivity /* * Class: com_hong_ndktest_MainActivity * Method: getData * Signature: ()Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_com_hong_ndktest_MainActivity_getData (JNIEnv * env, jobject jobj) { return (*env)->NewStringUTF(env, "from C"); } /* * Class: com_hong_ndktest_MainActivity * Method: getData2 * Signature: ()Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_com_hong_ndktest_MainActivity_getData2 (JNIEnv *env, jobject jobj) { return (*env)->NewStringUTF(env, "fromCgetData2"); }
效果:
點擊button後:
最後說一句:若是項目報錯的話 在 gradle.properties 文件中最後一行添加以下語句:
android.useDeprecatedNdk=true
demo下載地址: http://download.csdn.net/download/qq_33363534/9477065