NDK Java 调用 C代码

 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 __cplusplus
extern "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
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gdliweibing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值