NDK 初涉

1、定义调用的方法,含完整包名的类:
这里写图片描述
2、编译这个类,前提是JDK的环境变量配置正确。
这里写图片描述
3、生成.h头文件
这里写图片描述

这里写图片描述
4、生成的头文件内容:
这里写图片描述
5、实现jni的方法,C语言

#include <jni.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

//将java字符串转换为c语言字符串(工具方法)
char*   Jstring2CStr(JNIEnv*   env,   jstring   jstr)
{
     char*   rtn   =   NULL;
     jclass   clsstring   =   (*env)->FindClass(env,"java/lang/String");
     jstring   strencode   =   (*env)->NewStringUTF(env,"GB2312");
     jmethodID   mid   =   (*env)->GetMethodID(env,clsstring,   "getBytes",   "(Ljava/lang/String;)[B");
     jbyteArray   barr=   (jbyteArray)(*env)->CallObjectMethod(env,jstr,mid,strencode); // String .getByte("GB2312");
     jsize   alen   =   (*env)->GetArrayLength(env,barr);
     jbyte*   ba   =   (*env)->GetByteArrayElements(env,barr,JNI_FALSE);
     if(alen   >   0)
     {
      rtn   =   (char*)malloc(alen+1);         //"\0"
      memcpy(rtn,ba,alen);
      rtn[alen]=0;
     }
     (*env)->ReleaseByteArrayElements(env,barr,ba,0);  //
     return rtn;
}

JNIEXPORT jstring JNICALL Java_com_example_tangyd_1jni_NativeJNI_testJni
  (JNIEnv * env, jclass jobject, jstring text){
     //定义一个C语言字符串
     char* cstr = text;
     //返回值是java字符串,所以要将C语言的字符串转换成java的字符串
     //在jni.h 中定义了字符串转换函数的函数指针
     //jstring   (*NewStringUTF)(JNIEnv*, const char*);
     //第一种方法:很少用
     jstring jstr1 = (*(*env)).NewStringUTF(env, cstr);
     //第二种方法,推荐
     jstring jstr2 = (*env) -> NewStringUTF(env, cstr);
     //return jstr2;  
     char* c_char = Jstring2CStr(env, text);
      int i;
      for(i = 0;i<length;i++){
          *(cstr+i) += 1; //加密算法,将字符串每个字符加1
      }
      jstring backstring = (*env)->NewStringUTF(env,c_char);
      return backstring;
 }


JNIEXPORT jstring JNICALL Java_com_mwp_encodeanddecode_MainActivity_encode
  (JNIEnv * env, jobject obj, jstring text, jint length){
      char* cstr = Jstring2CStr(env, text);
      int i;
      for(i = 0;i<length;i++){
          *(cstr+i) += 1; //加密算法,将字符串每个字符加1
      }
      return (*env)->NewStringUTF(env,cstr);
}
JNIEXPORT jstring JNICALL Java_com_mwp_encodeanddecode_MainActivity_decode
(JNIEnv * env, jobject obj, jstring text, jint length){
     char* cstr = Jstring2CStr(env, text);
     int i;
     for(i = 0;i<length;i++){
         *(cstr+i) -= 1;
     }
     return (*env)->NewStringUTF(env, cstr);
}

6、项目根目录下建jni文件夹,把头文件和.c文件放进去(需要回到项目目录下面,不能用eclipse)
这里写图片描述
7、编写Android.mk文件

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := testJNI
LOCAL_SRC_FILES := native_jni.c
include $(BUILD_SHARED_LIBRARY)

8、进到项目根目录下打开cmd,生成共享库
这里写图片描述

发现error,C语言的错误,检查代码吧。
这里写图片描述

length出错,修改如下:
这里写图片描述

重新进行共享库生成:
截图1
这里写图片描述

截图,添加处理器文件夹:
这里写图片描述

运行提示错误:
10-11 15:19:03.584: D/dalvikvm(21170): No JNI_OnLoad found in /data/app-lib/com.example.tangyd_jni-1/libtestJNI.so 0x4202e968, skipping init
这个错误是没有JNI_OnLoad方法。
再重新生成链接库后报错:
10-11 15:29:39.177: A/libc(23153): Fatal signal 11 (SIGSEGV) at 0x0380001d (code=1), thread 23153 (mple.tangyd_jni)
这个是C语言中的实现问题,数据类型在做转换时,发生的内存问题。
原因是不能直接将jstring赋值给C的char,即
这里写图片描述

修改:
这里写图片描述

正确打印的结果:
这里写图片描述

Window10环境变量截图:
Android的adb
这里写图片描述

JDK:
这里写图片描述

这里写图片描述

NDK:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值