在好例子网,分享、交流、成长!
您当前所在位置:首页Java 开发实例Android平台开发 → JAVA JNI 样例,总结了JNI的书写方法。

JAVA JNI 样例,总结了JNI的书写方法。

Android平台开发

下载此实例
  • 开发语言:Java
  • 实例大小:0.08M
  • 下载次数:16
  • 浏览次数:235
  • 发布时间:2017-03-10
  • 实例类别:Android平台开发
  • 发 布 人:anking
  • 文件格式:.gz
  • 所需积分:1
 相关标签: java a

实例介绍

【实例简介】
【实例截图】

【核心代码】

#include <stdio.h>
//#include <jni.h>
#include "src_com_android_camera_TestCameraJni.h"

//本文件中用 Java_包名_类名_函数名 的JNI函数命名法

//要注意c与c 的写法不一样,这是因为 Android 源码中的 native 层的实现使用的是 C ,而我们这里使用的是 C语言

#ifdef __cplusplus
extern "C" {
#endif

JNIEXPORT jstring JNICALL Java_src_com_android_camera_TestCameraJni_testJni(JNIEnv *env,jobject obj,jint age,jstring name);
#ifdef __cplusplus
};
#endif

JNIEXPORT jstring Java_src_com_android_camera_TestCameraJni_nativeFunc(JNIEnv *env, jclass cls, jstring msg)
{
    const char *cmsg;
    char cres[1024];
    jstring res;
    cmsg = (*env)->GetStringUTFChars(env, msg, JNI_FALSE);
    memset(cres, '\0', 1024);
    strcat(cres, cmsg);
    strcat(cres, " (Solved)");
    res = (*env)->NewStringUTF(env, cres);
    (*env)->ReleaseStringUTFChars(env, msg, cmsg);
    return res;
}


JNIEXPORT jstring Java_src_com_android_camera_TestCameraJni_testJni(JNIEnv *env,jobject obj,jint age,jstring name)
{
//const char* pname = env->GetStringUTFChars(name, NULL); //C 的写法
const char* pname = (*env)->GetStringUTFChars(env,name, NULL);     //C的写法

printf("\nhello ,here is the JNICALL testJni: %d name:%s\n\n",age,pname);
#if 1
jclass class_Test = (*env)->GetObjectClass(env,obj); //获取JAVA实例,也就是TestCameraJni类的实例,所以后面的GetFieldID等都是TestCameraJni类的属性
 
//jfieldID fid_a = (*env)->GetFieldID(env,class_Test,"amessage","Ljava/lang/String;"); // TestCameraJni.amessage
//pname = (*env)->GetStringUTFChars(env,fid_a, NULL);
//printf("amessage : %s",fid_a);
//(*env)->SetObjectField(env,obj,fid_a,"2323");

jfieldID fid_b = (*env)->GetFieldID(env,class_Test,"id","I");
(*env)->SetIntField(env,obj,fid_b,12123);

#endif
(*env)->ReleaseStringUTFChars(env,name, NULL); //通知JVM销毁字符串所占空间,与GetStringUTFChars配对使用
return (*env)->NewStringUTF(env,"this is the C code return string !!");
}

#if 0
//char*   、 jstring互转
JNIEXPORT jstring JNICALL Java_com_explorer_jni_SambaTreeNative_getDetailsBy\
(JNIEnv *env, jobject jobj, jstring pc_server, jstring server_user, jstring server_passwd)  
{  
const char *pc = env->GetStringUTFChars(pc_server, NULL);  
const char *user = env->GetStringUTFChars(server_user, NULL);  
const char *passwd = env->GetStringUTFChars(server_passwd, NULL);  
const char *details = smbtree::getPara(pc, user, passwd);  
jstring jDetails = env->NewStringUTF(details);  
return jDetails;  


//char * 转 jstring
jstring WindowsTojstring(JNIEnv* env, char* str_tmp)  
{  
jstring rtn=0;  
int slen = (int)strlen(str_tmp);  
unsigned short* buffer=0;  
if(slen == 0){  
rtn = env->NewStringUTF(str_tmp);  
}  
else{  
int length = MultiByteToWideChar(CP_ACP, 0, (LPCSTR)str_tmp, slen, NULL, 0);  
buffer = (unsigned short*)malloc(length*2 1);  
if(MultiByteToWideChar(CP_ACP, 0, (LPCSTR)str_tmp, slen, (LPWSTR)buffer, length) > 0){  
rtn = env->NewString((jchar*)buffer, length);  
}  
}  
if(buffer){  
free(buffer);  
}  
return rtn;  
}  

//jbyteArray 转 char *                     
char* data = (char*)env->GetByteArrayElements(strIn, 0); 


//C 中的BYTE[]转jbyteArray 
//nOutSize是BYTE数组的长度 BYTE pData[]  
jbyte *by = (jbyte*)pData;  
jbyteArray jarray = env->NewByteArray(nOutSize);  
env->SetByteArrayRegin(jarray, 0, nOutSize, by); 

//jbyteArray 转 c 中的BYTE[] 
    //jbytearray strIn  
    jbyte * olddata = (jbyte*)env->GetByteArrayElements(strIn, 0);  
    jsize  oldsize = env->GetArrayLength(strIn);  
    BYTE* bytearr = (BYTE*)olddata;  
    int len = (int)oldsize;  

#endif


#include <stdio.h>
#include "jni.h"
#include "JNIHelp.h"
#ifdef __cplusplus
extern "C" {
#endif
//本文件中不用 Java_包名_类名_函数名 的JNI函数命名法,而是在JNI_OnLoad时注册本地方法
//JNI_OnLoad在System.loadLibrary()时,JVM会自动调用。

//要注意c与c 的写法不一样,这是因为 Android 源码中的 native 层的实现使用的是 C ,而我们这里使用的是 C语言

jstring testJni(JNIEnv *env,jobject obj,jint age,jstring name)
{
//const char* pname = env->GetStringUTFChars(name, NULL); //C 的写法
const char* pname = (*env)->GetStringUTFChars(env,name, NULL);     //C的写法

printf("\nhello ,here is the JNICALL testJni: %d name:%s\n\n",age,pname);
#if 1
jclass class_Test = (*env)->GetObjectClass(env,obj); //获取JAVA实例,也就是TestCameraJni类的实例,所以后面的GetFieldID等都是TestCameraJni类的属性
 
//jfieldID fid_a = (*env)->GetFieldID(env,class_Test,"amessage","Ljava/lang/String;"); // TestCameraJni.amessage
//pname = (*env)->GetStringUTFChars(env,fid_a, NULL);
//printf("amessage : %s",fid_a);
//(*env)->SetObjectField(env,obj,fid_a,"2323");

jfieldID fid_b = (*env)->GetFieldID(env,class_Test,"id","I");
(*env)->SetIntField(env,obj,fid_b,12123);

#endif
(*env)->ReleaseStringUTFChars(env,name, NULL); //通知JVM销毁字符串所占空间,与GetStringUTFChars配对使用
return (*env)->NewStringUTF(env,"this is the C code return string !!");
}


jstring native_function(JNIEnv *env, jclass cls, jstring msg)
{
    const char *cmsg;
    char cres[1024];
    jstring res;
    cmsg = (*env)->GetStringUTFChars(env, msg, JNI_FALSE);
    memset(cres, '\0', 1024);
    strcat(cres, cmsg);
    strcat(cres, " (Solved)");
    res = (*env)->NewStringUTF(env, cres);
    (*env)->ReleaseStringUTFChars(env, msg, cmsg);
    return res;
}


#ifdef __cplusplus
};
#endif
#if 0
//char*   、 jstring互转
JNIEXPORT jstring JNICALL Java_com_explorer_jni_SambaTreeNative_getDetailsBy\
(JNIEnv *env, jobject jobj, jstring pc_server, jstring server_user, jstring server_passwd)  
{  
const char *pc = env->GetStringUTFChars(pc_server, NULL);  
const char *user = env->GetStringUTFChars(server_user, NULL);  
const char *passwd = env->GetStringUTFChars(server_passwd, NULL);  
const char *details = smbtree::getPara(pc, user, passwd);  
jstring jDetails = env->NewStringUTF(details);  
return jDetails;  


//char * 转 jstring
jstring WindowsTojstring(JNIEnv* env, char* str_tmp)  
{  
jstring rtn=0;  
int slen = (int)strlen(str_tmp);  
unsigned short* buffer=0;  
if(slen == 0){  
rtn = env->NewStringUTF(str_tmp);  
}  
else{  
int length = MultiByteToWideChar(CP_ACP, 0, (LPCSTR)str_tmp, slen, NULL, 0);  
buffer = (unsigned short*)malloc(length*2 1);  
if(MultiByteToWideChar(CP_ACP, 0, (LPCSTR)str_tmp, slen, (LPWSTR)buffer, length) > 0){  
rtn = env->NewString((jchar*)buffer, length);  
}  
}  
if(buffer){  
free(buffer);  
}  
return rtn;  
}  

//jbyteArray 转 char *                     
char* data = (char*)env->GetByteArrayElements(strIn, 0); 


//C 中的BYTE[]转jbyteArray 
//nOutSize是BYTE数组的长度 BYTE pData[]  
jbyte *by = (jbyte*)pData;  
jbyteArray jarray = env->NewByteArray(nOutSize);  
env->SetByteArrayRegin(jarray, 0, nOutSize, by); 

//jbyteArray 转 c 中的BYTE[] 
    //jbytearray strIn  
    jbyte * olddata = (jbyte*)env->GetByteArrayElements(strIn, 0);  
    jsize  oldsize = env->GetArrayLength(strIn);  
    BYTE* bytearr = (BYTE*)olddata;  
    int len = (int)oldsize;  

#endif





//JNI register
////////////////////////////////////////////////////////////////
static const char *classPathName = "src/com/android/camera/TestCameraJni";

// 定义Java本地方法与JNI动态库中方法的映射关系
static JNINativeMethod methods[] = {
  {"testJni", "(ILjava/lang/String;)Ljava/lang/String;", (void*)testJni}, //注意后面的纷号,如果缺少将在注册时出错
  {"nativeFunc", "(Ljava/lang/String;)Ljava/lang/String;", (void *)native_function} //这个可以正常使用
};

/*
 * Register several native methods for one class.
 */
static int registerNativeMethods(JNIEnv* env, const char* className,
    JNINativeMethod* gMethods, int numMethods)
{
    jclass clazz;

    //clazz = env->FindClass(className); //C 的写法
    clazz = (*env)->FindClass(env,className); //C的写法
    if (clazz == NULL) {
  printf("error 3\n");
return JNI_FALSE;
    }

    //if (env->RegisterNatives(clazz, gMethods, numMethods) < 0) { //C 的写法
    if ((*env)->RegisterNatives(env,clazz, gMethods, numMethods) < 0) { //C的写法
  printf("error 2\n");
        return JNI_FALSE;
    }

    return JNI_TRUE;
}

/*
 * Register native methods for all classes we know about.
 *
 * returns JNI_TRUE on success.
 */
static int registerNatives(JNIEnv* env)
{
  if (!registerNativeMethods(env, classPathName,methods, sizeof(methods) / sizeof(methods[0]))) {
printf("error 1\n");
    return JNI_FALSE;
  }

  return JNI_TRUE;
}

typedef union {
    JNIEnv* env;
    void* venv;
} UnionJNIEnvToVoid;

jint JNI_OnLoad(JavaVM* vm, void* reserved)
{
    UnionJNIEnvToVoid uenv;
    uenv.venv = NULL;
    jint result = -1;
    JNIEnv* env = NULL;
    if ((*vm)->GetEnv(vm,&uenv.venv, JNI_VERSION_1_4) != JNI_OK) { //C的写法
    //if (vm->GetEnv(&uenv.venv, JNI_VERSION_1_4) != JNI_OK) { //C 的写法
        goto bail;
    }
    env = uenv.env;

    if (registerNatives(env) != JNI_TRUE) {
        goto bail;
    }
    printf("OK\n");
    result = JNI_VERSION_1_4;
    
bail:
    return result;
}






标签: java a

实例下载地址

JAVA JNI 样例,总结了JNI的书写方法。

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警