博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JNI Java与C的相互调用与基本操作
阅读量:6885 次
发布时间:2019-06-27

本文共 3008 字,大约阅读时间需要 10 分钟。

Java和Jni的类型对照表

引用类型对照表

一.Java调用C函数

1.字符串拼接

public native String concatString(String a, String b);复制代码
/** * 字符串拼接 */extern "C"JNIEXPORT jstring JNICALLJava_com_xfhy_ndkdemo_MainActivity_concatString(JNIEnv *env, jobject instance, jstring a_, jstring b_) {    //jstring 转 char*    const char *a = env->GetStringUTFChars(a_, 0);    const char *b = env->GetStringUTFChars(b_, 0);    //释放拷贝的内存    /*     * 第一个参数指定一个jstring变量,即是要释放的本地字符串的来源。        第二个参数就是要释放的本地字符串     * */    env->ReleaseStringUTFChars(a_, a);    env->ReleaseStringUTFChars(b_, b);    //动态申请一个地址空间    char *c = (char *) malloc(strlen(a) + strlen(b));    strcpy(c, a);    strcat(c, b);    //将char* 转jstring    return env->NewStringUTF(c);}复制代码

2.比较字符串

public native int compareString(String a, String b);复制代码
/** * 比较字符串 */extern "C"JNIEXPORT jint JNICALLJava_com_xfhy_ndkdemo_MainActivity_compareString(JNIEnv *env, jobject instance, jstring a_, jstring b_) {    const char *a = env->GetStringUTFChars(a_, 0);    const char *b = env->GetStringUTFChars(b_, 0);    env->ReleaseStringUTFChars(a_, a);    env->ReleaseStringUTFChars(b_, b);    return strcmp(a, b);}复制代码

3. 数组求和

public native int sumArray(int[] array);复制代码
/** * 数组求和 */extern "C"JNIEXPORT jint JNICALLJava_com_xfhy_ndkdemo_MainActivity_sumArray(JNIEnv *env, jobject instance, jintArray array_) {    //从java数组获取数组指针    jint *array = env->GetIntArrayElements(array_, NULL);    int sum = 0;    int len = env->GetArrayLength(array_);    for (int i = 0; i < len; i++) {        sum += array[i];    }    env->ReleaseIntArrayElements(array_, array, 0);    return sum;}复制代码

二.C调用Java方法

public class CallJava {    static {        System.loadLibrary("native-lib");    }    private static final String TAG = "CallJava";    public native void callVoidMethod();    public void hello() {        Log.e(TAG, "Java的hello方法");    }}复制代码
/** * 调用java的方法 */extern "C"JNIEXPORT void JNICALLJava_com_xfhy_ndkdemo_CallJava_callVoidMethod(JNIEnv *env, jobject instance) {    //通过反射调用java中的方法    //找class 使用FindClass方法,参数就是要调用的函数的类的完全限定名,但是需要把点换成/    jclass clazz = env->FindClass("com/xfhy/ndkdemo/CallJava");    //获取对应的函数: 参数1:类class,参数2:方法名,参数3:方法签名    //ps:方法签名的获取:进入build->intermediates->classes->debug目录下,使用javap -s 类的完全限定名,就能获得函数签名    jmethodID method = env->GetMethodID(clazz, "hello", "()V");    //实例化该class对应的实例  使用AllocObject方法,使用clazz创建该class的实例。    jobject object = env->AllocObject(clazz);    //调用方法    env->CallVoidMethod(object, method);}复制代码

三.在C中打印日志

在CMakeLists.txt中加入

find_library(             log-lib              log )target_link_libraries(                        native-lib                       ${log-lib} )复制代码

然后在cpp文件中加入

#include "android/log.h"#define LOG_TAG "JNI_TEST"#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)复制代码

使用方式:

int a = 10;LOGE("xfhy   我是C代码中的日志    a=%d", a);LOGE("我是xfhy");复制代码

转载地址:http://ghnbl.baihongyu.com/

你可能感兴趣的文章
2018最佳GAN论文回顾(下)
查看>>
Vue使用element-ui所遇BUG与需求集结(二)
查看>>
使用Redis管道提升性能
查看>>
包含Min函数的stack
查看>>
Java 8 常用时间 api
查看>>
联发科技智能家居事业群接管电视业务,下半年发8K电视芯片 ...
查看>>
用AI赋能客服,灵声科技获数千万元A轮融资
查看>>
3月14日云栖精选夜读 | 阿里云成为开源组织CDF创始成员,积极推动软件生态构建 ...
查看>>
弹性公网EIP,让网络更自由、灵活
查看>>
一对一直播源码都实现了哪几种常见的优化技术? ...
查看>>
Unity学习系列一简介
查看>>
利用Python框架pyxxnet_project实现的网络服务
查看>>
一个最简单的WebSocket hello world demo
查看>>
Midway 外部版启动过程分析
查看>>
2月26日云栖精选夜读 | 中国视频云市场格局已定,阿里云成第一大厂商
查看>>
记一次JVM调优
查看>>
进行移动端Unity开发,针对引擎PowerVR性能建议
查看>>
机器学习PAI全新功效——实时新闻热点Online Learning实践
查看>>
SWPU CTF题解
查看>>
golang并发ping主机
查看>>