1. 下载 android-ndk-r8b 解压,配置环境变量.D:\android-ndk-r8b-windows\android-ndk-r8b
2. 新建android 项目Test,并新建jni文件夹(用于存放mk,.c,.h文件),打开properties 选中builders ,双击“new”选项,在下一个对话框中选中“program”确定,接着main选项卡界面的name中输入Testndk;location输入D:\android-ndk-r8b-windows\android-ndk-r8b\ndk-build.cmd ,即ndk-build.cmd 的路径,working directory ,选择到jni文件夹;在refresh 选项卡界面,勾选完,其他的默认;buidoptions勾选第一个,和第三个,剩下的看默认;配好之后点击apply,ok;
3.jni 下
mk 文件
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := demo
LOCAL_LDLIBS := -llog //用于android log在c的输出
LOCAL_SRC_FILES := com_example_jnidemo_demo.c
include $(BUILD_SHARED_LIBRARY)
.h用java命令可以编译含native的java文件
.c
#include<jni.h>
#include "com_example_jnitest_TestJNI.h"
#include <stdio.h>
#include<stdlib.h>
#include<string.h>
#include <math.h>
#include <android/log.h>
#ifdef __cplusplus
extern "C" {
#endif
JNIEXPORT jint JNICALL Java_com_example_jnitest_TestJNI_max
(JNIEnv *env, jclass arg, jint a, jint b){
//类名
// jclass ToJNI_class = (*env)->FindClass(env, "com/example/jnitest/ToJNI");
//类方法
//jmethodID mTestToJNI = (*env)->GetMethodID(env, ToJNI_class, "TestToJNI","()V");
//执行类中的方法
//(*env)->CallVoidMethod(env, ToJNI_class, mTestToJNI);
return a+b;
}
JNIEXPORT jint JNICALL Java_com_example_jnitest_TestJNI_min
(JNIEnv *env, jclass arg, jintArray a, jintArray b){
jint *x,*y;
//指向数组
x = (*env)->GetIntArrayElements(env, a, NULL);
y = (*env)->GetIntArrayElements(env, b, NULL);
return min(x,y);
}
JNIEXPORT jstring JNICALL Java_com_example_jnitest_TestJNI_getName
(JNIEnv *env, jclass arg, jstring stra, jstring strb){
char outputbuf[128], inputbuf[128];
jint len = (*env)->GetStringLength(env, stra);
//获取java传递过来的字符串
(*env)->GetStringUTFRegion(env,stra,0,len,outputbuf);
printf("%s", outputbuf);
jstring str = (*env)->NewStringUTF(env, "Hello Test NDK !");
return str;
}
JNIEXPORT jintArray JNICALL Java_com_example_jnitest_TestJNI_maxarry
(JNIEnv *env, jclass arg){
jintArray array;//数组
array=(*env)->NewIntArray(env,10);
int i=1;
for(;i<=10;++i)
{
(*env)->SetIntArrayRegion(env,array,i-1,1,&i);
}
return array;
}
JNIEXPORT jfloat JNICALL Java_com_example_jnitest_TestJNI_distance
(JNIEnv *env, jobject arg , jobject point_a, jobject point_b){
//步骤1 获取对应的类
jclass point_class = (*env)->FindClass(env, "com/example/jnitest/Point");
if(point_class == NULL) {
//printf("class not found");
return 0;
} else {
//获取point 类的字段
jfieldID field_x = (*env)->GetFieldID(env,point_class,"x","F");
jfieldID field_y = (*env)->GetFieldID(env,point_class,"y","F");
//类方法
jmethodID mTestToJNI = (*env)->GetMethodID(env, point_class, "TestToJNI","()V");
//执行类中的方法
// (*env)->CallVoidMethod(env, point_a, mTestToJNI);
jobject mObject = (*env)->AllocObject(env, point_class);
(*env)->CallVoidMethod(env, mObject, mTestToJNI);
//获取point 字段对应的值
jfloat ax = (*env)->GetFloatField(env,point_a,field_x);
jfloat ay = (*env)->GetFloatField(env,point_a,field_y);
jfloat bx = (*env)->GetFloatField(env,point_b,field_x);
jfloat by = (*env)->GetFloatField(env,point_b,field_y);
return sqrtf(powf(bx-ax, 2) + powf(by-ay, 2));
}
}
int calc(int x,int y)
{
return (x + y - 1);
}
int min(int *a,int *b){
if(*a>*b){
return *b;
}else{
return (calc(a,b)) ;
}
}
#ifdef __cplusplus
}
#endif
#endif
4.完成c的编写和mk文件的编写后,编译成.so文件因为是在-8版本下可以用ctrl+b编译直接生成.so文件,省略了之前繁琐的步骤(高手就不觉得繁琐了...),编译成功会生成obj文件夹,在其目录下就可以看到.so文件。
------------------------------------------------好记性不如烂笔头!!!!!!!!!