在JNI与java之间传递数据

2 篇文章 0 订阅

“Android Studio”下“JNI”开发(linux.ubuntu)过程
JNI常用函数大全


传递String字符串

#MainActivity.java:
JNI jni = new jni();//实例化JNI对象
jni.helloFromC("world!");//调用本地方法
#JNI.java:
public class JNI{
    static{
        System.loadLibrary("hello-jni");//加载libhello-jni.so库
    }
    public static native String helloFromC(String key);//声明本地方法
}
#hello-jni.h:
#include <jni.h>
#ifndef _Included_com_example_wlf_callashleyt_JNI
#defin _Included_com_example_wlf_callashleyt_JNI
#ifdef __cplusplus
extern "C"{
#endif
JNIEXPORT jstring JNICALL Java_com_example_wlf_callashleyt_JNI_helloFromC
(JNIEnv, jclass,jsting);
#ifdef __cpusplus
}
#endif
#endif
#hello-jni.c:
#include <jni.h>
jstring charToJstring(JNIEnv*,const char*);//byte[]数组转jstring
JNIEXPORT jstring JNICALL Java_com_example_wlf_callashleyt_JNI_helloFromC
(JNIEnv *env, jclass obj,jsting key){
    /*
    先将key类型由jstring转为char*
    /*
    const char *str = (*env)->GetStringUTFChars(env,key,0);
    if(str == NULL)
        return NULL;
    char buf[50] = "Hello:";
    strcat(buf,str);//字符串拼接
    (*env)->ReleaseStringUTFChars(env,key,str);
    return charToJstring(env,buf);//字符串处理后再转回jstring,以传递回java
    //见[getMethodID函数解释及方法签名]
}
jstring charToJstring(JNIEnv* env,const char* str){

    jclass clstring = (*env)->FindClass("java/lang/String");
    //获取对象
    jmethodID mid = (*env)->GetMethodID(env,clstring,"<init>","([BLjava/lang/String;)V");//获取String(byte[],String)的构造器,用于将本地byte[]数组转换为一个新String
    jbyteArray bytes = (*env)->NewByteArray(env,strlen(str));//建立jbyte数组
    (*env)->SetByteArrayRegion(bytes, 0, strlen(str), (jbyte*) str);//将char* 转换为byte数组
    jstring encoding = (env)->NewStringUTF("utf-8");// 设置String, 保存语言类型,用于byte数组转换至String时的参数
    return (jstring) (env)->NewObject(strClass, ctorID, bytes, encoding);//将byte数组转换为java String,并输出
}

getMethodID函数解释及方法签名

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值