Android的jni下c与java数据互传测试代码
16lz
2022-04-02
test.java
public class test {public native String test();public native byte[] testbyte(byte[] by);}
hello.c #include #include #include "com_example_jnitest_test.h"#include #include #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() {}@Overridepublic 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): test05-25 02:30:53.512: I/jni_log(330): GetArrayLength = 305-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: MapView加载多个 overlay 内存溢出
- Android(安卓)7.0调用系统相机返回路径问题
- Android中EventBus事件总线发送网络请求结果更新UI
- Android(安卓)通过百度地图SDK 实现地图显示和定位(一)
- Android设置Settings:预读取设置的选项和更新设置结果【2】
- android瀑布流简单实现原理
- 详解Android(安卓)getWidth和getMeasuredWidth
- Android(安卓)手机获取时区
- Eclipse 开发 Android, Hello FormStuff(学习9)