NDK Java 调用 C代码

来源:互联网 发布:进销存数据库设计 编辑:程序博客网 时间:2024/05/01 15:36

 Java 调用 C代码

1、编写接口

package com.lwb.testndk;public class JNI {    static {        // 静态初始化代码块,这里加载的库名称要和 gradle 中定义的 moduleName 名称一致        System.loadLibrary("LwbLib");    }    public static  native  int add(int var1,int var2);    public static native  String syHello(String var1);    public static native  int[] increaseArayEles(int[] var1);    public static native  int checkPwd(String var1);}

2、命令行javah com.lwb.testndk.JNI 产生头文件com_lwb_testndk_JNI.h

#include <stdio.h>#include <stdlib.h>#include <string.h>/* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* 要使用Log则需要引用 android/log.h 这个头文件 */#include <android/log.h>/* 可以根据需要调用不同类型的 LOG */#ifndef LOG_TAG#define LOG_TAG "ANDROID_LOG"#define LOG_E(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG , __VA_ARGS__)#define LOG_I(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG , __VA_ARGS__)#define LOG_W(...) __android_log_print(ANDROID_LOG_WARN, LOG_TAG , __VA_ARGS__)#define LOG_D(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG , __VA_ARGS__)#endif/* Header for class com_lwb_testndk_JNI */#ifndef _Included_com_lwb_testndk_JNI#define _Included_com_lwb_testndk_JNI#ifdef __cplusplusextern "C" {#endif/* * Class:     com_lwb_testndk_JNI * Method:    add * Signature: (II)I */JNIEXPORT jint JNICALL Java_com_lwb_testndk_JNI_add  (JNIEnv *, jobject, jint, jint);/* * Class:     com_lwb_testndk_JNI * Method:    syHello * Signature: (Ljava/lang/String;)Ljava/lang/String; */JNIEXPORT jstring JNICALL Java_com_lwb_testndk_JNI_syHello  (JNIEnv *, jobject, jstring);/* * Class:     com_lwb_testndk_JNI * Method:    increaseArayEles * Signature: ([I)[I */JNIEXPORT jintArray JNICALL Java_com_lwb_testndk_JNI_increaseArayEles  (JNIEnv *, jobject, jintArray);/* * Class:     com_lwb_testndk_JNI * Method:    checkPwd * Signature: (Ljava/lang/String;)I */JNIEXPORT jint JNICALL Java_com_lwb_testndk_JNI_checkPwd  (JNIEnv *, jobject, jstring);#ifdef __cplusplus}#endif#endif

3、编写C文件

#include "com_lwb_testndk_JNI.h"/**利用Java的String类来完成字符编码转换*/char* _Jstring2CStr(JNIEnv *env,jstring jstr) {    char *rtn = NULL;    jclass clsstring = (*env)->FindClass(env, "java/lang/String");    jstring strencode = (*env)->NewStringUTF(env, "GB2312");//转换成Cstring的GB2312,兼容ISO8859-1    jmethodID mid = (*env)->GetMethodID(env, clsstring, "getBytes", "(Ljava/lang/String;)[B");    jbyteArray barr = (jbyteArray) (*env)->CallObjectMethod(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);        memcpy(rtn, ba, alen);        rtn[alen] = 0;            //"\0"    }    (*env)->ReleaseByteArrayElements(env, barr, ba, 0);    return rtn;};/* * Class:     com_lwb_testndk_JNI * Method:    add * Signature: (II)I */JNIEXPORT jint  JNICALL Java_com_lwb_testndk_JNI_add        (JNIEnv *env, jobject jobject, jint ji, jint jj) {    int result = ji + jj;    return result;};/* * */JNIEXPORT jstring  JNICALL Java_com_lwb_testndk_JNI_syHello        (JNIEnv *env, jobject jobject, jstring jstr) {    LOG_I ("log 类型 _I 000000 ");//    char* fromJava = _Jstring2CStr(env, jstr);    //c:    char* fromJava = (char *) malloc(100 );   fromJava = " I am fromJava";    char* fromc = "add I am from c";//    strcat(fromJava, fromc);//把拼接的结果放在第一个参数    LOG_I ("log 类型 _I 222222222222");    return (*env)->NewStringUTF(env, fromc);};/*  每个数加10 * Class:     com_lwb_testndk_JNI * Method:    increaseArayEles * Signature: ([I)[I */JNIEXPORT jintArray JNICALL Java_com_lwb_testndk_JNI_increaseArayEles        (JNIEnv *env, jobject jobject, jintArray jintArray){    //数组的长度    int len = (*env)->GetArrayLength(env,jintArray);    LOG_I ("len = %d " ,len);    int i ;    jint* var = (*env)->GetIntArrayElements(env,jintArray,JNI_FALSE);    for(int i=0;i<len;i++){        *(var + i) = *(var + i) + 10;        LOG_I ("var = %d " ,  *(var + i));    }    return jintArray;};JNIEXPORT jint JNICALL Java_com_lwb_testndk_JNI_checkPwd        (JNIEnv * env, jobject jobj, jstring jstr){     char* orgin = "123456";    char* fromUser = "1234567";//     char* fromUser =  _Jstring2CStr(env, jstr);     int code = strcmp(orgin,fromUser);    if(code ==0 ){        return 200;    }else{        return 400;    }};

4、测试

public class MainActivity extends AppCompatActivity {    private static final String TAG = "MainActivity";    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        TextView textView = (TextView) findViewById(R.id.text);//        textView.setText(GetString.getNativeStr());        textView.setText(new GetString().getNativeStr());//        TextView textView2 =(TextView)findViewById(R.id.text2);//        textView2.setText(GetString2.getNativeStr2());    }    public void add(View view) {        int result = JNI.add(55, 66);        Log.i(TAG, "add: result = " + result);    }    public void syHello(View view) {        String result = JNI.syHello("from java");        Log.i(TAG, "syHello: result = " + result);    }    public void increaseArayEles(View view) {        int[] var1 = new int[10];        for (int i = 0; i < var1.length; i++) {            var1[i] = i;        }        int[] result = JNI.increaseArayEles(var1);        for (int i = 0; i < result.length; i++) {            Log.i(TAG, "syHello: result = " + result[i]);        }    }    public void checkPwd(View view) {        int result = JNI.checkPwd("123456");        Log.i(TAG, "syHello: result = " + result);    }}


0 0