NDK开发java调用c(三)

java调c
1.写native代码用于调用c代码,在java中写
public class JNI {
    static {
        System.loadLibrary("Test");
    }
    /*
    * 定义native方法
    * 调用c代码对应的方法
    * */
 /*
 * 让c代码做加法运算 把结果返回给java
 *
 * */
 public native int add(int x,int y);
 /*
 * 从java传入字符串,c代码进行拼接
 *
 * s I am from java
 * I am from java I am from c
 * */
 public native String sayHello(String s);
 /*
 * 让c代码给每个元素都加上十
 * */
 public native int[] increaseArrayEles(int[] intArray);
/* *
* 应用:检查密码是否正确 如果正确 返回200 否则返回400
* */
 public native int checkPwd(String pwd);
}
2.编译动态链接库,什么也不配置,编译的动态链接库是以当前的module名称为库名称
lib+modulename+.so
最好是配置动态链接库的名称,在build.gradle中
 defaultConfig {
        applicationId "www.basketi.cn.basketball.ccalljavademo"
        minSdkVersion 15
        targetSdkVersion 24
        versionCode 1
        versionName "1.0"
        ndk{
            moduleName ("Test");
            abiFilters "armeabi", "armeabi-v7a", "x86"
        }
        ndk{
            ldLibs "log"
        }
    }
3.加载动态链接库
 static {
//加载动态链接库
        System.loadLibrary("Test");
    }
4.写对应的c代码
 java中native去调用c代码
 给含有native方法的类生成头文件,如JNI类,然后根据头文件中的方法,写对应的c代码

c代码
/* DO NOT EDIT THIS FILE - it is machine generated */
#include "www_basketi_cn_basketball_javacallcdemo_JNI.h"
#include<jni.h>
#include<stdio.h>
#include <stdlib.h>
#include<string.h>
char* _jstringToChar(JNIEnv* env, jstring jstr)
{
    char* rtn = NULL;
    jclass clsstring = (*env)->FindClass(env,"java/lang/String");
    jstring strencode = (*env)->NewStringUTF(env,"UTF-8");
    jmethodID mid = (*env)->GetMethodID(env,clsstring, "getBytes", "(Ljava/lang/String;)[B");
    jbyteArray barr= (jbyteArray)(*env)->CallObjectMethod(env,jstr,mid,strencode);
    jsize alen = (*env)->GetArrayLength(env,barr);
    jbyte * ba = (*env)->GetByteArrayElements(env,barr,JNI_FALSE);
    if(alen > 0)
    {
        rtn = (char*)malloc(alen+1); //new char[alen+1];
        memcpy(rtn,ba,alen);
        rtn[alen]=0;
    }
    (*env)->ReleaseByteArrayElements(env,barr,ba,0);

    return rtn;
}
/*
jint 返回值
Java_www_basketi_cn_basketball_javacallcdemo_JNI 全类名_方法名
*/
 jint  Java_www_basketi_cn_basketball_javacallcdemo_JNI_add
  (JNIEnv *evn, jobject jobject, jint ji, jint jj){
    int result=ji+jj;
        return result;
  };
    jstring Java_www_basketi_cn_basketball_javacallcdemo_JNI_sayHello
        (JNIEnv * env, jobject jt, jstring js){
        //c:  将jstring 转换为char类型
        char* fromJava=_jstringToChar(env,js);
        char* fromC="add I am from C";
        //拼接函数
           strcat(fromJava,fromC);//把拼接的结果放在第一个参数里面
            //将char类型转换成jstring
            return (*env)->NewStringUTF(env,fromJava);
//return "";
     };
/**
*给每个元素加上十
*/
jintArray Java_www_basketi_cn_basketball_javacallcdemo_JNI_increaseArrayEles
  (JNIEnv * env, jobject jb, jintArray jintArray){
        //1 得到数组长度
        jsize size=(*env)->GetArrayLength(env,jintArray);
        //2.得到数组元素
        jint* ja=(*env)->GetIntArrayElements(env,jintArray,JNI_FALSE);
        //3.遍历数组 给每个元素加上10
        int i;
        for(i=0;i<size;i++){
            *(ja+i)+=10;

        }

        //4 返回结果
        return jintArray;
  };
JNIEXPORT jint JNICALL Java_www_basketi_cn_basketball_javacallcdemo_JNI_checkPwd
  (JNIEnv *env, jobject jobject, jstring jstring){

    //假设服务器的密码123456
    char* origin="123456";
    char* user=_jstringToChar(env,jstring);
    //函数 比较字符串是否相同
    int code =strcmp(origin,user);
    if(code==0){
        return 200;
    }else{
        return 400;
    }
  };
5.执行java调用c的代码
 
jni=new JNI();
((Button) findViewById(R.id.jcc)).setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        jni.add(991,1);
        Log.i("add---",jni.add(991,1)+"");
    }
});
((Button) findViewById(R.id.jcc2)).setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        String result=jni.sayHello("i am from java");
        Log.i("javacllc----",result);
    }
});
((Button) findViewById(R.id.jcc3)).setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        int array[]={1,2,3};
        int[] cArray=jni.increaseArrayEles(array);
        for (int i=0;i<cArray.length;i++){
            Log.i("-cArray---",cArray[i]+"");
        }
    }
});
((Button) findViewById(R.id.checkpwd)).setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        int result=jni.checkPwd("123456");
        Log.i("-检验结果result---",result+"");
    }
});
源码地址:http://download.csdn.net/detail/lzq520210/9733500
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值