android NDK 配置过程(太久不用也是会忘记的!!!)

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文件。

 

------------------------------------------------好记性不如烂笔头!!!!!!!!!

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值