Android的jni下c与java数据互传测试代码
2016-05-25 10:31
316 查看
test.java
MainActivity.java
结果:
public class test { public native String test(); public native byte[] testbyte(byte[] by); }hello.c
#include <stdio.h> #include <jni.h> #include "com_example_jnitest_test.h" #include <string.h> #include <android/log.h> #define LOG_TAG "jni_log" #define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__) #define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__) JNIEXPORT jstring JNICALL Java_com_example_jnitest_test_test (JNIEnv * env, jobject obj){ LOGI("------test-------"); return (*env)->NewStringUTF(env, "jni test 1234567890"); } void printData(char *info, char *d, int len){ int i; char buf[256]; for(i = 0; i < len; i++){ sprintf(buf+i*3, "%02x ", *d++); } LOGI("%s %s", info, buf); } JNIEXPORT jbyteArray JNICALL Java_com_example_jnitest_test_testbyte (JNIEnv * env, jobject obj, jbyteArray jarrByte){ jsize len = (*env)->GetArrayLength(env, jarrByte); LOGI("GetArrayLength = %d", len); jbyte *b = (*env)->GetByteArrayElements(env, jarrByte, 0); if(b == NULL){ LOGI("b is null"); return NULL; } printData("b data:", b, len); char tmp[] ={0x11,0x12,0x13,0x14,0x15}; char buf[128]; memcpy(buf, b, len); memcpy(buf+len, tmp, sizeof(tmp)); int size = len+sizeof(tmp); jbyteArray ret = (*env)->NewByteArray(env, size); (*env)->SetByteArrayRegion(env, ret, 0, size, buf); (*env)->ReleaseByteArrayElements(env, ret, b, 0); return ret; }
MainActivity.java
public static class PlaceholderFragment extends Fragment { public PlaceholderFragment() { } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.fragment_main, container, false); System.loadLibrary("Hello"); TextView tv = (TextView)rootView.findViewById(R.id.test); test t = new test(); tv.setText(t.test()); Log.d("jni", "test"); byte[] by = {0x01,0x02,0x03}; byte[] out = t.testbyte(by); Log.d("jni",b2h(out)); return rootView; } } private static String b2h(byte[] in){ String ret = ""; for(int i = 0; i < in.length; i++){ String tmp = Integer.toHexString(in[i]&0xff); if(tmp.length() == 1) tmp = "0" + tmp; ret += tmp+" "; } return ret; }
结果:
05-25 02:30:53.502: I/jni_log(330): ------test------- 05-25 02:30:53.502: D/jni(330): test 05-25 02:30:53.512: I/jni_log(330): GetArrayLength = 3 05-25 02:30:53.512: I/jni_log(330): b data: 01 02 03 05-25 02:30:53.512: W/dalvikvm(330): JNI: unpinPrimitiveArray(0x4054f888) failed to find entry (valid=1) 05-25 02:30:53.512: D/jni(330): 01 02 03 11 12 13 14 15
相关文章推荐
- 生产者-消费者模型在Android开发中的应用
- Android Studio 2.1中的instant run功能 介绍
- Android Studio Gradle 对应的下载目录
- Android端手机测试体系
- 根据时间戳判断是星期几
- Android资源文件简介
- android webview中调用了js的混淆
- Android下拉刷新上拉加载控件,对所有View通用!
- Android Studio 优秀插件汇总
- Android自定义View之继承TextView绘制背景
- Android xml实现animation的4种动画效果实例代码
- Android 地址选择器,实现省市区三级联动
- 实验五 迭代法解线性方程组与非线性方程(android)
- Android使用EventBus
- android获取根View的方法
- Android 开源项目侧边栏菜单(SlidingMenu)使用详解
- Android Studio之新建jniLibs(类似小问题)
- AndroidFloatLabel,实现TextView浮动提示
- Android自定义下拉刷新上拉加载
- Android中多点触摸协议