“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,并输出
}