固然事前必定要先配好环境;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