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源代码的更多相关文章
- 一、Android NDK编程预备之Java jni简介
转自: http://www.eoeandroid.com/thread-264384-1-1.html 游戏开发 视频教程 博客 淘帖 论坛›eoe·Android应用开发区›Androi ...
- Android使用JNI(从java调用本地函数)
当编写一个混合有本地C代码和Java的应用程序时,需要使用Java本地接口(JNI)作为连接桥梁.JNI作为一个软件层和API,允许使用本地代码调用Java对象的方法,同时也允许在Java方法中调用本 ...
- Android系统进程间通信Binder机制在应用程序框架层的Java接口源代码分析
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6642463 在前面几篇文章中,我们详细介绍了A ...
- Android For JNI(一)——JNI的概念以及C语言开发工具dev-c++,编写你的第一个C语言程序,使用C启动JAVA程序
Android For JNI(一)--JNI的概念以及C语言开发工具dev-c++,编写你的第一个C语言程序 当你的Android之旅一步步的深入的时候,你其实会发现,很多东西都必须去和framew ...
- 三、Android NDK编程预备之Java jni入门创建C/C++共享库
转自: http://www.eoeandroid.com/thread-264971-1-1.html 应网友回复,答应在两天前要出一篇创建C/C++共享库的,但由于清明节假期,跟朋友出去游玩,丢手 ...
- 二、Android NDK编程预备之Java jni入门Hello World
转自: http://www.eoeandroid.com/forum.php?mod=viewthread&tid=264543&fromuid=588695 昨天已经简要介绍了J ...
- [Android Webkit]JNI基础及Java层与C++层的交互
1. JNI 注册 1.1. JNI的基础结构 JAVA == JNI == Native Code JNI(Java Native Interface)是Java与Native ...
- Android与JNI(二) ---- Java调用C++ 动态调用
目录: 1. 简介 2. JNI 组件的入口函数 3. 使用 registerNativeMethods 方法 4. 测试 5. JNI 帮助方法 6. 参考资料 1. 简介 Android与JNI( ...
- [Android]-图片JNI(C++\Java)高斯模糊的实现与比較
版权声明:本文作者:Qiujuer https://github.com/qiujuer; 转载请注明出处,盗版必究! !! https://blog.csdn.net/qiujuer/article ...
随机推荐
- listview向下滑动过程中背景色变成黑色和一些奇怪问题
ListView是一个经常要用到的android控件,现总结遇到过的一些美化的小细节. 1.listview在拖动的时候背景图片消失变成黑色背景,等到拖动完毕我们自己的背景图片才显示出来 这个问题是我 ...
- 看牙与IT项目
周末为了一颗牙第五次去牙科诊所,得到的消息是:还需要观察至少2周才能做牙冠,同时发现了较深的牙结石需要做刮治,刮治疗需要2次.因此至少要再去医院3次.从去年的六月体检发现这颗牙的问题,目前最乐观估计也 ...
- 闭包拾遗 & 垃圾回收机制
闭包拾遗 之前写了篇<闭包初窥>,谈了一些我对闭包的浅显认识,在前文基础上,补充并且更新些对于闭包的认识. 还是之前的那个经典的例子,来补充些经典的解释. function outerFn ...
- UITextField实现左侧空出一定的边距
就是通过uitextfield的leftview来实现的,同时要设置leftviewmode. 如果设置左右边距,需要再加上rightView功能 -(void)setTextFieldLeftPad ...
- requirejs自己的学习
1.最新版本的RequireJS压缩后只有14K. 2.模块化,不在使用全局变量,都用块级作用域包装. 3.防止js加载阻止页面渲染. 4.避免出现多个javascript的标签.
- angularJS中-$route路由-$http(ajax)的使用
后台请求使用的是nodeJS驱动(后面帖代码),很简单的RESTFUL, 页面使用的是bottstarp3.0(懒人神器); 第一个例子: 在本地架设NODEJS, angular的所有请求都是请求本 ...
- 第一节Unity3D简介
Unity是由Unity Technologies开发的一个让玩家轻松创建诸如三维视频游戏.建筑可视化.实时三维动画等类型互动内容的多平台的综合型游戏开发工具,是一个全面整合的专业游戏引擎.Unity ...
- [JQuery EasyUI系列]简介
一.jQuery EasyUI是一个基于jQuery的框架,继承了各种用户界面插件. 二.jQuery EasyUI框架提供了创建网页所需的一切,可以轻松建立站点. easyui是一个基于jQuery ...
- 使用PowerDesigner创建表并导入到数据库
使用PowerDesigner创建表并导入到数据库 刚刚学习使用PowerDesigner进行数据库的创建,下面我就分享一下如何创建表并导入到数据库. 1.首先到网上下载一下PowerDesigner ...
- Xamarin.Forms入门学习路线
Xamarin 介绍 Xamarin是一套跨平台解决方案,目的是使用C#语言创造原生的iOS,Android,Mac和Windows应用. Xamarin的三个优势: Xamarin App拥有原生A ...