public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        Button btn = new Button(this);
        btn.setText("测试ndk");
        btn.setOnClickListener(new ButtonOnClickListener());
        setContentView(btn);
        Toast.makeText(getApplicationContext(), PATH, Toast.LENGTH_LONG).show();
    }
    
    public final class ButtonOnClickListener implements OnClickListener{
     
  @Override
  public void onClick(View arg0) {
   // TODO Auto-generated method stub
   byte[] data = "zhanghongliu".getBytes();
   FileInputStream fis = null;
   FileOutputStream fos = null;
   int i = 0;
         for(i=1;i<=200000;i++){
    try {
     fis = new FileInputStream(RESOURCEPATH);
     int size = fis.available();
     data = new byte[size];
     fis.read(data, 0, size);
     String result = FileJNILib.videoCrypt(data,ENCRYPTPATH);
     Toast.makeText(getApplicationContext(), result, Toast.LENGTH_LONG).show();
     
           data = FileJNILib.videoDerypt(ENCRYPTPATH);
           fos = new FileOutputStream(DECRYPTPATH);
           fos.write(data);
    } catch (FileNotFoundException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    } catch (IOException e) {
     // TODO Auto-generated catch block
     e.printStackTrace();
    }finally{
     try {
      if(null != fis){
       fis.close();
      }
      if(null != fos){
       fos.close();
      }
      data = null;
     } catch (IOException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
     }
    }
          Log.i("count", i+"");
          //data = null;
         }
         //Toast.makeText(getApplicationContext(), new String(data), Toast.LENGTH_LONG).show();
      //show();
  }
  
  public void show(){
   File newfile = new File(PATH);
         FileInputStream inStream = null;
   try {
    inStream = new FileInputStream(newfile);
   } catch (FileNotFoundException e) {
    // TODO Auto-generated catch block
    //e.printStackTrace();
   }
         String content = FileUtil.readInStream(inStream);
         Log.i("FileText", content);
         Toast.makeText(getApplicationContext(), content, Toast.LENGTH_LONG).show();
  }
     
    }

public static String readInStream(FileInputStream inStream){
  try {
   ByteArrayOutputStream outStream = new ByteArrayOutputStream();
   byte[] buffer = new byte[1024];
   int length = -1;
   while((length = inStream.read(buffer)) != -1 ){
    outStream.write(buffer, 0, length);
   }
   outStream.close();
   inStream.close();
   return outStream.toString();
  } catch (IOException e) {
   Log.i(TAG, e.getMessage());
  }
  return null;
 }

public class FileJNILib {
 
 static {
        System.loadLibrary("filejni");
    }
    public static native String videoCrypt(byte[] content, String dest_file);
    public static native byte[] videoDerypt(String dest_file);

public static native String videoDerypt(String dest_file, ByteArrayOutputStream outputstream);
    
}

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <sys/stat.h>

#include <jni.h> //jni的主要头文件

#include <android/log.h>
#define LOG_TAG "JNI"
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
/* Header for class com_test_jni_FileJNILib */

/*
 * Class:     com_test_jni_FileJNILib
 * Method:    videoCrypt
 * Signature: ([BLjava/lang/String;)V
 */
JNIEXPORT jstring JNICALL videoCrypt
  (JNIEnv * env, jclass thiz, jbyteArray content, jstring dest_file){
  //env->GetStringUTFChars(source,NULL);

const char *path = (*env)->GetStringUTFChars(env, dest_file, NULL);
  LOGI(path);

FILE *fp = fopen(path,"wb");
  if(fp==NULL){
   LOGI("fopen error");
   (*env)->ReleaseStringUTFChars(env,dest_file, path);
   return (*env)->NewStringUTF(env, "fopen error");
  }
  char *data = (*env)->GetByteArrayElements(env,content, 0);
  int size = (*env)->GetArrayLength(env,content);
  //int iLen = sizeof(data);//C语言中判断数据类型或者表达式长度符
  LOGI("file size is %d", size);

crypt(data,size);

/******文件写入方法***********/
  //fputc('c',fp);
  //fputs(data,fp);
  fwrite(data,size,1,fp);
  //fprintf(fp,"%s",data);
  /*****************/

fclose(fp);
  (*env)->ReleaseByteArrayElements(env,content,data,0);
  (*env)->ReleaseStringUTFChars(env,dest_file, path);
  LOGI("execute complete");
  return (*env)->NewStringUTF(env, "encrypt successful");
}

/*
 * Class:     com_test_jni_FileJNILib
 * Method:    videoDerypt
 * Signature: (Ljava/lang/String;)[B
 */
JNIEXPORT jbyteArray JNICALL videoDerypt
  (JNIEnv * env, jclass thiz, jstring dest_file){
   const char *path = (*env)->GetStringUTFChars(env, dest_file, NULL);
   LOGI(path);

/*****得到文件长度*******/
   int size;
   struct stat  tFileStat;
   if( stat(path, &tFileStat ) )
   {
    LOGI("file not found error");
    (*env)->ReleaseStringUTFChars(env,dest_file, path);
    return NULL;
   }
   size=tFileStat.st_size;
   LOGI("file size is %d",size);//报错 int
   /************/

/*****分配内存*******/
   char *temp = NULL;
   temp=(char*)malloc(size);
   if(temp == NULL)
   {
    LOGI("malloc error");
    (*env)->ReleaseStringUTFChars(env,dest_file, path);
    return NULL;
   }
   // memset(temp,0x00,size*sizeof(char)+1);//初始化内存
   /************/

FILE *fp = fopen(path,"rb");
   if(fp==NULL){
    LOGI("fopen error");
    (*env)->ReleaseStringUTFChars(env,dest_file, path);
    free(temp);//释放内存
    temp=NULL;
    return NULL;
   }

/******文件读方法***********/
   //fgetc(fp);
   //fgets(temp,100,fp);
   fread(temp,size,1,fp);
   //fscanf(fp,"%s",temp);
   /*****************/

fclose(fp);

crypt(temp,size);

jbyteArray jarrRV =(*env)->NewByteArray(env,size);
   jbyte *jby =(*env)->GetByteArrayElements(env,jarrRV, 0);
   memcpy(jby, temp, size);//复制数据
   (*env)->SetByteArrayRegion(env,jarrRV, 0,size, jby);//将Jbyte 转换为jbarray数组
   (*env)->ReleaseByteArrayElements(env,jarrRV,jby,0);//释放jby数组* 解决长时间运行退出问题 内部引用超过指定数量
   //(*env)->DeleteLocalRef(env,jarrRV);//影响程序
   //(*env)->DeleteLocalRef(env,temp);//不对  一般用malloc申请内存,free释放
   free(temp);
   temp=NULL;
   (*env)->ReleaseStringUTFChars(env,dest_file, path);
   LOGI("execute complete");
   return jarrRV;
}

void crypt(char *data, int size){
 int i;
 char sPwd[]="************************";
    int pwdLen = sizeof(sPwd);
    //LOGI("dongao.com mobile_encrypt %d",pwdLen);
 int count=0;
 for(i=0; i<size; i++)
 {
            if(count >= pwdLen) count = 0;
   data[i]=data[i]^sPwd[count++];
   //LOGI("%c",sPwd[count >= 10 ?count=0:count++]);
 }
}

/*
 * Class:     com_test_jni_FileJNILib
 * Method:    videoDerypt
 * Signature: (Ljava/lang/String;Ljava/io/ByteArrayOutputStream;)V
 */
JNIEXPORT jstring JNICALL videoDerypt2ByteArray
  (JNIEnv * env, jclass thiz, jstring dest_file, jobject outputstream){
 return NULL;
}

static const JNINativeMethod gMethods[] = { //定义批量注册的数组,是注册的关键部分
{"videoCrypt", "([BLjava/lang/String;)Ljava/lang/String;", (void*)videoCrypt} ,// func2是在java中声明的native函数名,"()V"是函数的签名,可以通过javah获取。
{"videoDerypt", "(Ljava/lang/String;)[B", (void*)videoDerypt},
{"videoDerypt", "(Ljava/lang/String;Ljava/io/ByteArrayOutputStream;)Ljava/lang/String;", (void*)videoDerypt2ByteArray}
};

JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void *reserved) //这是JNI_OnLoad的声明,必须按照这样的方式声明

{

JNIEnv* env = NULL; //注册时在JNIEnv中实现的,所以必须首先获取它

jint result = -1;

if((*vm)->GetEnv(vm, (void**)&env, JNI_VERSION_1_4) != JNI_OK) //从JavaVM获取JNIEnv,一般使用1.4的版本

return -1;

jclass clazz;

static const char* const kClassName="com/test/jni/FileJNILib";

clazz = (*env)->FindClass(env, kClassName); //这里可以找到要注册的类,前提是这个类已经加载到java虚拟机中。 这里说明,动态库和有native方法的类之间,没有任何对应关系。

if(clazz == NULL)

{

LOGI("cannot get class:%s\n", kClassName);

return -1;

}

if((*env)->RegisterNatives(env, clazz,gMethods, sizeof(gMethods)/sizeof(gMethods[0]))!= JNI_OK) //这里就是关键了,把本地函数和一个java类方法关联起来。不管之前是否关联过,一律把之前的替换掉!

{

LOGI("register native method failed!\n");

return -1;

}

return JNI_VERSION_1_4; //这里很重要,必须返回版本,否则加载会失败。

}

原文 http://blog.csdn.net/zhanghongliu1122/article/details/9411921

Android(Java):jni源代码的更多相关文章

  1. 一、Android NDK编程预备之Java jni简介

    转自:  http://www.eoeandroid.com/thread-264384-1-1.html 游戏开发 视频教程 博客 淘帖     论坛›eoe·Android应用开发区›Androi ...

  2. Android使用JNI(从java调用本地函数)

    当编写一个混合有本地C代码和Java的应用程序时,需要使用Java本地接口(JNI)作为连接桥梁.JNI作为一个软件层和API,允许使用本地代码调用Java对象的方法,同时也允许在Java方法中调用本 ...

  3. Android系统进程间通信Binder机制在应用程序框架层的Java接口源代码分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6642463 在前面几篇文章中,我们详细介绍了A ...

  4. Android For JNI(一)——JNI的概念以及C语言开发工具dev-c++,编写你的第一个C语言程序,使用C启动JAVA程序

    Android For JNI(一)--JNI的概念以及C语言开发工具dev-c++,编写你的第一个C语言程序 当你的Android之旅一步步的深入的时候,你其实会发现,很多东西都必须去和framew ...

  5. 三、Android NDK编程预备之Java jni入门创建C/C++共享库

    转自: http://www.eoeandroid.com/thread-264971-1-1.html 应网友回复,答应在两天前要出一篇创建C/C++共享库的,但由于清明节假期,跟朋友出去游玩,丢手 ...

  6. 二、Android NDK编程预备之Java jni入门Hello World

    转自:  http://www.eoeandroid.com/forum.php?mod=viewthread&tid=264543&fromuid=588695 昨天已经简要介绍了J ...

  7. [Android Webkit]JNI基础及Java层与C++层的交互

    1. JNI 注册 1.1. JNI的基础结构       JAVA == JNI == Native Code      JNI(Java Native Interface)是Java与Native ...

  8. Android与JNI(二) ---- Java调用C++ 动态调用

    目录: 1. 简介 2. JNI 组件的入口函数 3. 使用 registerNativeMethods 方法 4. 测试 5. JNI 帮助方法 6. 参考资料 1. 简介 Android与JNI( ...

  9. [Android]-图片JNI(C++\Java)高斯模糊的实现与比較

    版权声明:本文作者:Qiujuer https://github.com/qiujuer; 转载请注明出处,盗版必究! !! https://blog.csdn.net/qiujuer/article ...

随机推荐

  1. 利用Maven管理工程项目本地启动报错及解决方案

    目前利用Maven工具来构建自己的项目已比较常见.今天主要不是介绍Maven工具,而是当你本地启动这样的服务时,如果遇到报错,该如何解决?下面只是参考的解决方案,具体的解法还是得看log的信息. 1. ...

  2. 结合C++和GDAL实现shapefile(shp)文件的创建和写入

    工具:vs2012+GDAL 2.0 包含头文件: #include "ogrsf_frmts.h" int main() { const char *pszDriverName ...

  3. MyBatis出错Result Maps collection does not contain value for java.lang.Integer

    Servlet.service() for servlet [SpringMVC] in context with path [/eyou] threw exception [Request proc ...

  4. 20135316王剑桥 linux第十一周课实验笔记

    getenv函数 1.获得环境变量值的函数 2.参数是环境变量名name,例如"HOME"或者"PATH".如果环境变量存在,那么getenv函数会返回环境变量 ...

  5. iOS——关于创建真机调试证书(发布证书,测试(调试)证书,推送调试证书)、iOS开发者账号申请 请用开发者账号去iTunes connect 查看状态

  6. C#基础之内存分配

    1.创建一个对象 一个对象的创建过程主要分为内存分配和初始化两个环节.在.NET中CLR管理的内存区域主要有三部分:栈.GC堆.LOH堆,栈主要用来分配值类型数据.它的管理是有系统控制的,而不是像GC ...

  7. 鼠标滚动插件smoovejs和wowjs

    置顶文章:<纯CSS打造银色MacBook Air(完整版)> 上一篇:<图片ping.JSONP和CORS跨域> 作者主页:myvin 博主QQ:851399101(点击QQ ...

  8. 工作的思考十五:升职前需要做的准备(TeamLeader)

    当一个人在公司的工作年限以及经验的积累到达一个程度的时候,升职其实是件高兴的事,但面临角色的转变需要提前做些准备的. 其实如果你对你的职业规划很清楚的话,那么你就应该在升职之前就会开始进行角色的转换. ...

  9. DOM(七)使用DOM控制表格

    表格的css控制就先不说了,首先分享下表格常用的DOM 表格添加操作的方法常用的为insertRow()和insertCell()方法. row是从零开始计算起的,例如: var oTr = docu ...

  10. 转-JS之Window对象

    一.说明:他是JS中最大的对象,它描述的是一个浏览器窗口,一般要引用他的属性和方法时,不需要用“Window.XXX”这种形式,而是直接使用“XXX”.一个框架页面也是一个窗口. 二.Window窗口 ...