当然事前一定要先配好环境;
下面来说步骤:
1. 在代码里写入要调用的native方法:
String getData();
String getData2();
2. 动态链接库;
System.loadLibrary("ndktest")
3. 在build.gradle文件中 加入ndk{...}代码:
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 文件夹;
5. 在jni 文件夹里面创建 .c 文件:
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
(注释: 红字 23 这里要根据你build.gradle文件中的 tartgetSdkVersion 更改);
当回车之后没有反应 就成功了,在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