c中掉java
来源:互联网 发布:c语言数组去重的方法 编辑:程序博客网 时间:2024/05/17 11:33
java中调用C代码
一、先写java类,例子如下
package com.example.ndkpassdata;public class DataProvider { /** * 计算x和y的加法 * @param x * @param y * @return */ public native int add(int x, int y); /** * 给字符串后面拼接字符 加密运算 * @param s * @return */ public native String sayHelloInc(String s); /** * 给c代码传递int数组 ,让c代码给这个数组进行操作 * 图形和声音的处理 * @param iNum * @return */ public native int[] intMethod(int[] iNum);}
二、使用javah命令生成该类对用C的头文件,然后在工程目录中新建jni文件夹,将该头文件拖入。
三、编写该头文件对应的c实现文件
#include "com_example_ndkpassdata_DataProvider.h"#include "android/log.h"#include<stdio.h>#define LOG_TAG "clog"#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)/*java字符串转c字符串*/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 > 0) { rtn = (char*)malloc(alen+1); //"\0" memcpy(rtn,ba,alen); rtn[alen]=0; } (*env)->ReleaseByteArrayElements(env,barr,ba,0); // return rtn;}JNIEXPORT jint JNICALL Java_com_example_ndkpassdata_DataProvider_add (JNIEnv *env, jobject jobject, jint x, jint y){ LOGD("x = %d", x); LOGI("y = %d", y); return x + y;}JNIEXPORT jstring JNICALL Java_com_example_ndkpassdata_DataProvider_sayHelloInc (JNIEnv *env, jobject jobject, jstring str){ char* c = "hello"; char* str1 = Jstring2CStr(env, str); char* strResult = strcat(str1, c); return (*env)->NewStringUTF(env, strResult);}JNIEXPORT jintArray JNICALL Java_com_example_ndkpassdata_DataProvider_intMethod (JNIEnv *env, jobject jobject, jintArray arr){ int length = (*env)->GetArrayLength(env, arr); int* a = (*env)->GetIntArrayElements(env, arr, 0); int i = 0; for(; i < length; ++i){ a[i] += 5; } return arr;}
四、编写Android.mk文件
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) ---生成的so文件名-----LOCAL_MODULE := DataProvider -----需要交叉编译的c文件LOCAL_SRC_FILES := DataProvider.c--需要受用的本地库,如log日志---LOCAL_LDLIBS += -lloginclude $(BUILD_SHARED_LIBRARY)
五、使用ndk-build编译
六、在java中就可以使用DataProvider类了
0 0
- c中掉java
- C/C++/Java 中static对比
- java、C语言中default
- Java中调用C库函数
- java中模拟c/c++中unsigned
- C中^和Java中^的不同
- android JNI中C中调用java中方法
- 如何在C/C++中调用Java
- Java中模拟C中的标准输入
- java与c中数组的区别
- 如何在C/C++中调用Java
- 如何在C/C++中调用Java
- 怎么样在C/C++中调用Java
- c中和java中数组的区别
- JAVA 中printf与c的区别
- Android 在C/C++中调用Java
- Android 在C/C++中调用Java
- android中java与c互调
- js时间戳与日期格式之间的转换
- 查看linux中shell的几种方法汇总
- Android缩略图优化内存
- ZOJ 1654--Place the Robots【二分匹配 && 经典建图】
- Android开发之Volley定制自己的Request
- c中掉java
- Android UI(ImageView CheckBox)、ListView和Adapter
- Sublime 概述
- 9Patch制图
- Nginx/LVS/HAProxy负载均衡软件的优缺点详解
- HDU1106排序
- 【POJ 3122】 Pie (二分+贪心)
- Android Fragment(四)---Fragment与Activity通讯
- Android开发从源码的角度理解Volley