JNI系列——PassData
1.在工程目录下创建xxx.jni包并在该包下创建JNI类
2.在JNI类中声明所有的本地方法,并加载库
3.在MainActivity类中实例化JNI对象,并调用其方法
4.通过Javah生成的方法名在对应C文件中进行实现
5.在jni目录下添加Android.mk和Application.mk文件
Demo:
JNI.java:
public class JNI
{
static {
System.loadLibrary("pass_data");
}
public native int add(int x, int y);
public native String string(String str);
public native int [] intArrayElements(int[] array);
}
MainActivity.java:
public class MainActivity extends Activity implements OnClickListener
{
Button bt_int = null;
Button bt_string = null;
Button bt_array = null;
public JNI jni = null;
Context mContext = null;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mContext = this;
jni = new JNI();
bt_int = (Button) findViewById(R.id.bt_int);
bt_string = (Button) findViewById(R.id.bt_string);
bt_array = (Button) findViewById(R.id.bt_array);
bt_int.setOnClickListener(this);
bt_string.setOnClickListener(this);
bt_array.setOnClickListener(this);
} @Override
public void onClick(View v)
{
switch (v.getId())
{
case R.id.bt_int:
Toast.makeText(mContext, jni.add(4, 8) + "", Toast.LENGTH_SHORT).show();
break;
case R.id.bt_string:
Toast.makeText(mContext, jni.string("abcdefg"), Toast.LENGTH_SHORT).show();
break;
case R.id.bt_array:
int [] array = new int[]{1, 2, 3, 4, 5};
jni.intArrayElements(array);
for (int i : array)
{
Log.d("test", i + "");
}
break;
default:
break;
}
}
}
pass_data.c
#include <stdio.h>
#include <stdlib.h>
#include <jni.h>
/*
* Class: com_rocky_passdata_jni_JNI
* Method: add
* Signature: (II)I
*/
JNIEXPORT jint JNICALL Java_com_rocky_passdata_jni_JNI_add
(JNIEnv *env, jobject clazz, jint x, jint y)
{
return x + y;
}
/**
* 把一个jstring转换成一个c语言的char* 类型.
*/
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 > ) {
rtn = (char*)malloc(alen+); //"\0"
memcpy(rtn, ba, alen);
rtn[alen]=;
}
(*env)->ReleaseByteArrayElements(env, barr, ba,);
return rtn;
}
/*
* Class: com_rocky_passdata_jni_JNI
* Method: string
* Signature: (Ljava/lang/String;)Ljava/lang/String;
*/
JNIEXPORT jstring JNICALL Java_com_rocky_passdata_jni_JNI_string
(JNIEnv *env, jobject clazz, jstring str)
{
char *cstr = _JString2CStr(env, str);
int len = strlen(cstr);
int i;
for (i = ; i < len; i ++)
{
*(cstr + i) += ;
}
return (*env)->NewStringUTF(env, cstr);
}
JNIEXPORT jintArray JNICALL Java_com_rocky_passdata_jni_JNI_intArrayElements
(JNIEnv *env, jobject clazz, jintArray array)
{
int i;
jsize len = (*env)->GetArrayLength(env, array);
int *elements = (*env)->GetIntArrayElements(env, array, NULL);
for (i = ; i < len; i ++)
{
*(elements + i) += ;
}
return array;
}
Android.mk
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := pass_data
LOCAL_SRC_FILES := pass_data.c
include $(BUILD_SHARED_LIBRARY)
Application.mk
APP_ABI := all
APP_PLATFORM := android-
JNI系列——PassData的更多相关文章
- JVMTI 中间JNI系列功能,线程安全和故障排除技巧
JVMTI 中间JNI系列功能,线程安全和故障排除技巧 jni functions 在使用 JVMTI 的过程中,有一大系列的函数是在 JVMTI 的文档中 没有提及的,但在实际使用却是很实用的. 这 ...
- JNI系列——C文件中的方法调用Java中方法
1.创建xxx.jni包并在该包下实现一些Java的方法,和要调用的本地方法 2.实现MainActivity中的按钮点击事件-即点击按钮调用本地的方法 3.在C文件中的方法中回调Java的方法 3. ...
- JNI系列——简便开发流程
1.编写Java代码 2.选中工程目录--右键单击Android Tools--Add Native Support 3.输入要生成的库名 4.到工程目录中jni目录下对自动生成文件和.mk文件进行相 ...
- JNI系列——C文件中使用logcat
1.在Android.mk文件中添加:LOCAL_LDLIBS += -llog 注:加载的这个库在NDK对应平台目录下的lib目录中. 2.在C文件中添加如下内容: #include <and ...
- JNI系列——常见错误
1.本地方法没有找到 原因一:在Java代码中没有加载对应的类 原因二:在.c文件中将本地的方法名转换错误 2.本地库返回为空 原因一:加载的库名称错误 原因二:生成的库与部署设备平台错误
- JNI由浅入深_7_c调用Java方法一
1.在Java中声明方法 <span style="font-size:14px;">/** * javah -encoding utf-8 -jni com.exam ...
- Android深入理解JNI(二)类型转换、方法签名和JNIEnv
相关文章 Android深入理解JNI系列 前言 上一篇文章介绍了JNI的基本原理和注册,这一篇接着带领大家来学习JNI的数据类型转换.方法签名和JNIEnv. 1.数据类型的转换 首先给出上一篇文章 ...
- 必读的 Android 文章
必读的 Android 文章 掘金官方 关注 2017.06.07 13:58* 字数 25218 阅读 8782评论 2喜欢 218 写给 Android 开发者的混淆使用手册 - Android ...
- Android面试题集
前几天整理了Java面试题集合,今天再来整理下Android相关的面试题集合.假设你希望能得到最新的消息,能够关注https://github.com/closedevice/interview-ab ...
随机推荐
- [转]C# 连接 Oracle 的几种方式
本文转自:http://www.cnblogs.com/storys/archive/2013/03/06/2945914.html 一:通过System.Data.OracleClient(需要安装 ...
- 《InsideUE4》-3-GamePlay架构(二)Level和World
UE4深入学习QQ群: 456247757 引言 上文谈到Actor和Component的关系,UE利用Actor的概念组成一片游戏对象森林,并利用Component组装扩展Actor的能力,让世界里 ...
- c++学习之容器细枝末节(1)
对照着c++primier 开始学习第九章容器,把课后习题当做练习,虽然是看过书上的讲解,但是做题编程的时候,一些需要注意的地方还是难免有遗漏. 一下是几点印象比较深刻的总结: (1)前几章只学了ve ...
- Codeforces Round #286 Div.1 A Mr. Kitayuta, the Treasure Hunter --DP
题意:0~30000有30001个地方,每个地方有一个或多个金币,第一步走到了d,步长为d,以后走的步长可以是上次步长+1,-1或不变,走到某个地方可以收集那个地方的财富,现在问走出去(>300 ...
- AC日记——输出亲朋字符串 openjudge 1.7 05
05:输出亲朋字符串 总时间限制: 1000ms 内存限制: 65536kB 描述 编写程序,求给定字符串s的亲朋字符串s1. 亲朋字符串s1定义如下:给定字符串s的第一个字符的ASCII值加第二 ...
- SQL2012连接字符串
安装了sqlserver2012数据库,测试一包代码,搜索网上的方法,死活连接不上,最后偶然测试通过,居然是连接字符串的问题. “如果开发软件的时候是在局域网或者是在本机,并且数据库不在远程计算机上面 ...
- [No00003D]操作系统Operating Systems信号量的代码实现Coding Semaphore &死锁处理Deadlock
操作系统Operating Systems信号量的代码实现Coding Semaphore &死锁处理Deadlock 可以操刀了—从纸上到实际 从Linux 0.11 那里学点东西… 读磁盘 ...
- 转:软件架构入门 (from 阮一峰)
说明:其中讲到了 5 种的架构模型,很不错. from: http://www.ruanyifeng.com/blog/2016/09/software-architecture.html
- Windows系统服务器IIS7.5 Asp.net支持10万请求的设置方法
问题现象 ECS Windows系统服务器基于IIS搭建的网站由于IIS默认的配置,服务器最多只能处理5000个同时请求,访问量大时很容易导致报错: Error Summary: HTTP Erro ...
- Windows7 64位压缩包安装MySQL5.7.9
官网下载64bit MySQL5.7.9压缩包, 解压至安装位置 1. 创建my.ini文件, 内容如下 [mysqld] # Remove leading # and set to the amou ...