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
原创粉丝点击