Android(Java):jni源代码

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源代码,布布扣,bubuko.com

时间: 2024-08-02 15:12:26

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

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

当编写一个混合有本地C代码和Java的应用程序时,需要使用Java本地接口(JNI)作为连接桥梁.JNI作为一个软件层和API,允许使用本地代码调用Java对象的方法,同时也允许在Java方法中调用本地函数. 在Java端,开发者所需要做的仅仅是在连接本地函数的方法之前加上native关键字.这样VM就会去寻找这个本地函数. 1.从Java调用本地函数 从Java调用本地函数时,需要在类中定义一个带有native关键字的特有方法,作为连接本地代码的桥梁.通过这个定义,尝试调用本地方法时JVM会找

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

文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6642463 在前面几篇文章中,我们详细介绍了Android系统进程间通信机制Binder的原理,并且深入分析了系统提供的Binder运行库和驱动程序的 源代码.细心的读者会发现,这几篇文章分析的Binder接口都是基于C/C++语言来实现的,但是我们在编写应用程序都是基于Java语言的,那么,我 们如何使用Java语言来使用系统的Binder机

[Android] 图片JNI(C++\Java)高斯模糊 多线程

在我的博客中,曾经发布了一篇高斯模糊(堆栈模糊)的文章:在其中使用了国外的一个堆栈模糊来实现对图片的模糊处理:同时弄了一个JNI C++ 的版本. 这篇文章依然是堆栈模糊:可以说最原始的地方还是堆栈模糊部分:只不过是支持多线程的. 纳尼??感情是之前那个不支持多线程?Sorry,我说错了:两个都是支持多线程调用的.不过新讲的这个是能在内部采用多线程进行分段模糊. 原来的:[Android]-图片JNI(C++\Java)高斯模糊的实现与比较 开工吧 说明:其中代码大部分来源于网络,不过都是开源的

Android与JNI(二) ---- Java调用C 动态调用(转载)

目录: 1. 简介 2. JNI 组件的入口函数 3. 使用 registerNativeMethods 方法 4. 测试 5. JNI 帮助方法 6. 参考资料 1. 简介 目录: 1. 简介 2. JNI 组件的入口函数 3. 使用 registerNativeMethods 方法 4. 测试 5. JNI 帮助方法 6. 参考资料 1. 简介 Android与JNI(一)已经简单介绍了如何在 android  环境下使用 JNI 了.但是遵循 JNI 开发的基本步骤似乎有点死板,而且得到的

【我的Android进阶之旅】Android调用JNI出错 java.lang.UnsatisfiedLinkError: No implementation found for的解决方法

错误描述 今天使用第三方的so库时候,调用JNI方法时出现了错误.报错如下所示: 11-01 16:39:20.979 4669-4669/com.netease.xtc.cloudmusic E/art: No implementation found for void com.netease.xtc.cloudmusic.utils.NeteaseMusicUtils.nativeInit(android.content.Context) (tried Java_com_netease_xt

Android Wifi子系统源代码View

本文基于Android 4.2.2+Linux3.6.9+SAMA5D3 SoC从源代码的角度审视Android Wifi子系统. 软件平台:Linux3.6.9 + Android 4.2.2 硬件平台:Atmel SAMA5 Wifi模组:RTL8723AU(USB接口) Android的WiFi子系统自上而下包括如下一些内容: 应用层 Androd系统自带Settings应用 /system/app/Settings.apk http://androidxref.com/4.2.2_r1/

Android之——JNI初探

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/47405683 这里,我将用一个小例子的形式来帮助大家初探JNI的用法,首先,大家要先搭建好NDK环境,请大家先阅读<Android之--NDK环境搭建>一文. 一.实现 这个小例子实现的功能就是,通过Android中的java代码来调用C代码实现java代码与C代码之间的交互. 1.布局文件 我们首先在布局文件activity_main.xml中,添加一个按钮控件,并给按钮控件

Andorid Binder进程间通信---Java接口源代码--System和应用程序进程间通信

本文参考<Android系统源代码情景分析>,作者罗升阳 一.架构代码: ~/Android/frameworks/base/core/java/android/os ----IInterface.java (Interface) ----IServiceManager.java (IServiceManager) ----IBinder.java (IBinder) ----Binder.java (BinderProxy,Binder) ----ServiceManagerNative.j

OpenCV4Android释疑: 透析Android以JNI调OpenCV的三种方式(让OpenCVManager永不困扰)

前文曾具体探讨了关于OpenCV的使用,原本以为天下已太平.但不断有人反应依旧配不好OpenCV4Android,不能得心应手的在Android上使用OpenCV.大量的精力都浪费在摸索配置上.尤其是OpenCVManager诞生之后.更让人无语.大家第一个反应就是怎样才干不安装OpenCVManager.由于要多安装这个东西对客户来说体验太不好了. 咱家昨夜研究至两点,今早七点起床.最终把头绪理清了. 以下咱家以之前做过的一个基于OpenCV2.3.1.android通过jni调用opencv