`
月下独酌
  • 浏览: 130503 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

jni

 
阅读更多
/*
 * Copyright (C) 2008 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#define LOG_TAG "simplejni_NativeAdd.cpp"
#include <utils/Log.h>
#include <stdio.h>
#include "jni.h"

static const char *classPathName = "com/archermind/teast/NativeNadd";

char* jstringTostring(JNIEnv* env, jstring jstr);
jstring stoJstring(JNIEnv* env, const char* pat);

static jboolean
getjboolean(JNIEnv *env, jobject thiz, jboolean z){
	return !z;
}

static jbyte
getjbyte(JNIEnv *env, jobject thiz, jbyte b){
	LOGD("%s=%d","getbyte",b);
	return b+1;
}

static jchar
getjchar(JNIEnv *env, jobject thiz, jchar c){
	LOGD("%s=%d","getchar",c);
	return c+1;
}

static jshort
getjshort(JNIEnv *env, jobject thiz, jshort s){
	LOGD("%s=%d","getshort",s);
	return s+1;
}

static jint
getjint(JNIEnv *env, jobject thiz, jint i){
	LOGD("%s=%d","getint",i);
    	jclass clazz;
    	jmethodID methodID;
    	clazz = env->FindClass(classPathName);
    	if (clazz != NULL) {
		/*java callback,call from c/c++ to java */
		methodID = env->GetMethodID(clazz, "javaAdd", "(II)I");
		int ret = env->CallIntMethod(thiz, methodID, i, i);
		LOGD("ret=%d",ret);
		return ret;
    	}
	return i+1;
}

static jfloat
getjfloat(JNIEnv *env, jobject thiz, jfloat f){
	LOGD("%s=%f","getfloat",f);
	return f+1;
}

static jdouble
getjdouble(JNIEnv *env, jobject thiz, jdouble d){
	LOGD("%s=%f","getdouble",d);
	return d+1;
}

static jlong
getjlong(JNIEnv *env, jobject thiz, jlong j){
	LOGD("%s=%d","getlong",(int)j);
	return j+1;
}

static jobject
getobjdata(JNIEnv *env, jobject thiz, jobject obj){
	jclass clazz =(env)->FindClass("com/archermind/teast/ObjData");

	//从传进来的对象中取出byte[],对应jbyteArray类型
	jfieldID byteData = (env)->GetFieldID(clazz,"bData","[B");
	jbyteArray pDataIn = (jbyteArray) (env)->GetObjectField(obj, byteData);
	jsize theArrayLeng = env->GetArrayLength(pDataIn);
	//jbyteArrya转为jbyte*
	jbyte *arrayBody = env->GetByteArrayElements(pDataIn,0);
        //jbyte*转为char*
	char *jDataIn = (char *)arrayBody;
	*jDataIn=*jDataIn+1;

	//从传进来的对象中取出int
	jfieldID intData = (env)->GetFieldID(clazz,"len","I");
	jint jintdata = (jint) (env)->GetObjectField(obj, intData);
	jintdata = jintdata + 1;	
	LOGD("jindata=%d",jintdata);

	//从传进来的对象中取出StringArray
	jfieldID strsData = (env)->GetFieldID(clazz,"strs","[Ljava/lang/String;");
	jobjectArray jstrArraydata = (jobjectArray) (env)->GetObjectField(obj, strsData);
	jsize thestrArrayLen = env->GetArrayLength(jstrArraydata);
	int i = 0;   
	for (i = 0; i < thestrArrayLen; i++) {   
		jobject obj = (env)->GetObjectArrayElement(jstrArraydata, i);   
		jstring str = (jstring)obj;   
		char* szStr = jstringTostring(env,str);
		printf(" %d-%s ", i, szStr);   
		free(szStr);
	}


	//将char*转为jbyte*
	char *jDataOut = jDataIn;
	jbyte *bytes = (jbyte*)jDataOut;   
	//将jbyte*转为jbyteArray
	jbyteArray jarray = env->NewByteArray(theArrayLeng);
	env->SetByteArrayRegion(jarray, 0, theArrayLeng, bytes);

	//创建jobjectArray
	jobjectArray jretargs = 0;   
	jsize sizeofstrArray = 5;   
	jclass objClass = (env)->FindClass("java/lang/String");   
	jretargs = (env)->NewObjectArray(sizeofstrArray, objClass, 0);   
	//给jobjectArray赋值
	jstring strTmp;   
	const char* sa[] = { "Hello", "world", "zhang", "san", "yuang" };   
	int j = 0;   
	for (j = 0; j < sizeofstrArray; j++) {   
		strTmp = stoJstring(env,sa[j]);
		(env)->SetObjectArrayElement(jretargs, j, strTmp);   
	}   

	//给每一个实例的变量赋值
	(env)->SetObjectField(obj,byteData,jarray);
	(env)->SetIntField(obj,intData,jintdata);
	(env)->SetObjectField(obj,strsData,jretargs);

	//release
	(env)->ReleaseByteArrayElements(pDataIn, arrayBody, 0); 	
	
	return obj;
}

static jstring
getjstring(JNIEnv *env, jobject thiz, jstring jstr){
	char *str = jstringTostring(env,jstr);
	LOGD("%s=%s","getstring",str);
	const char *temp ="_sss";
	int len = strlen(str) + strlen(temp) +1 ;
	char *str3 = new char[len];
	strcpy(str3,str);
	strcat(str3,temp);
	sprintf(str3,"%s%s",str,temp);
	jstring js = stoJstring(env,str3);
	delete[] str3;
	free(str);	
	return js;
}

// jstring to char*
char* jstringTostring(JNIEnv* env, jstring jstr)
{
	char* rtn = NULL;
	jclass clsstring = env->FindClass("java/lang/String");
	jstring strencode = env->NewStringUTF("utf-8");
	jmethodID mid = env->GetMethodID(clsstring, "getBytes", "(Ljava/lang/String;)[B");
	jbyteArray barr= (jbyteArray)env->CallObjectMethod(jstr, mid, strencode);
	jsize alen = env->GetArrayLength(barr);
	jbyte* ba = env->GetByteArrayElements(barr, JNI_FALSE);
	if (alen > 0)
	{
		rtn = (char*)malloc(alen + 1);
		memcpy(rtn, ba, alen);
		rtn[alen] = 0;
	}
	env->ReleaseByteArrayElements(barr, ba, 0);
	return rtn;
} 

//char* to jstring
jstring stoJstring(JNIEnv* env, const char* pat)
{
	jclass strClass = env->FindClass("java/lang/String");
	jmethodID ctorID = env->GetMethodID(strClass, "<init>", "([BLjava/lang/String;)V");
	jbyteArray bytes = env->NewByteArray(strlen(pat));
	env->SetByteArrayRegion(bytes, 0, strlen(pat), (jbyte*)pat);
	jstring encoding = env->NewStringUTF("utf-8");
	return (jstring)env->NewObject(strClass, ctorID, bytes, encoding);
} 

static JNINativeMethod methods[] = {
  {"getBoolean", "(Z)Z", (void*)getjboolean },
  {"getByte", "(B)B", (void*)getjbyte },
  {"getChar", "(C)C", (void*)getjchar },
  {"getShort", "(S)S", (void*)getjshort },
  {"getInt", "(I)I", (void*)getjint },
  {"getFloat", "(F)F", (void*)getjfloat },
  {"getDouble", "(D)D", (void*)getjdouble },
  {"getLong", "(J)J", (void*)getjlong },
  {"getString", "(Ljava/lang/String;)Ljava/lang/String;", (void*)getjstring },
  {"getObjData", "(Lcom/archermind/teast/ObjData;)Lcom/archermind/teast/ObjData;", (void*)getobjdata },

};

/*
 * 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);
    if (clazz == NULL) {
        LOGE("Native registration unable to find class '%s'", className);
        return JNI_FALSE;
    }
    if (env->RegisterNatives(clazz, gMethods, numMethods) < 0) {
        LOGE("RegisterNatives failed for '%s'", className);
        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]))) {
    return JNI_FALSE;
  }

  return JNI_TRUE;
}


// ----------------------------------------------------------------------------

/*
 * This is called by the VM when the shared library is first loaded.
 */
 
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;
    
    LOGI("JNI_OnLoad");

    if (vm->GetEnv(&uenv.venv, JNI_VERSION_1_4) != JNI_OK) {
        LOGE("ERROR: GetEnv failed");
        goto bail;
    }
    env = uenv.env;

    if (registerNatives(env) != JNI_TRUE) {
        LOGE("ERROR: registerNatives failed");
        goto bail;
    }
    
    result = JNI_VERSION_1_4;
    
bail:
    return result;
}


package com.archermind.teast;

import android.util.Log;
/*
Z boolean
B byte
C char
S short
I int
J long
F float
D double
Ljava/lang/String String;
*/

/*
jboolean,
jbyte,
jchar,
jshort,
jint,
jlong,
jfloat,
jdouble
jstring
*/
public class NativeNadd {

    static {

        System.loadLibrary("teastjni");
        
    }
    public native boolean getBoolean(boolean b);
    public native byte getByte(byte b);   
    public native char getChar(char b);   
    public native short getShort(short b);   
    public native int getInt(int b);    
    public native float getFloat(float f);   
    public native double getDouble(double d);   
    public native long getLong(long b);        
    public native String getString(String str);   
//    public native String[] getStringArray(String[] sa);   

    public native ObjData getObjData(ObjData obj);
    	
    private int javaAdd(int a, int b){
    	Log.i("xx","javaAdd");
    	return a + b + 1 ;
    }
    
}
class ObjData { 
	public byte[]  bData;
	public int len;      
	public String[] strs;
}

分享到:
评论

相关推荐

    jni.zip jni编译jni下载

    JNI,全称Java Native Interface,是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。JNI在很多场景下非常有用,比如当需要利用已有的C或C++库,或者提升性能时,我们可以通过JNI将Java代码与本地...

    DELPHI开发JNI必备 jni.pas

    JNI,全称Java Native Interface,是Java平台标准的一部分,它为Java代码和其他语言写的代码提供了一个接口。在Java应用程序中,JNI允许Java代码调用本地(非Java)代码,反之亦然,使得开发者能够利用Java的跨平台...

    JNI的两个头文件jni.h和jni_md.h

    JNI,全称Java Native Interface,是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。JNI在很多场景下都是必要的,比如调用操作系统本地库、加速性能关键的代码或者利用硬件特性等。本文将深入...

    jni.h头文件

    3. **JNI常量**:定义了一些预定义的常量,如`JNI_VERSION_1_1`, `JNI_VERSION_1_2`, `JNI_VERSION_1_4`, `JNI_VERSION_1_6`, `JNI_VERSION_1_8`等,用于表示JNI接口的版本。 4. **JNI环境变量**:`JNIEnv`结构体中...

    jni传递对象数组

    JNI,全称Java Native Interface,是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。JNI在很多场景下非常有用,比如当需要利用已有的C/C++库或者优化性能时。本篇文章将深入探讨如何在JNI中传递...

    Android通过JNI调用.so动态库

    Android 通过 JNI 调用.so 动态库 Android 通过 JNI(Java Native Interface)调用.so 动态库是 Android 开发中的一种常用技术。JNI 是一种允许 Java 代码与 native 代码之间进行交互的接口。通过 JNI,我们可以在 ...

    jni.h文件.7z

    JNI,全称Java Native Interface,是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。JNI在很多场景下都是必要的,比如当需要利用已有的C/C++库,或者为了性能优化而需要直接调用硬件接口时。在这...

    Java jni调用c实例

    Java JNI(Java Native Interface)是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。JNI在很多场景下被使用,比如优化性能、利用已有的C/C++库或者访问操作系统特定的功能。在这个"Java jni调用...

    Android调用Jni返回自定义对象

    在Android开发中,Java Native Interface (JNI) 是一个关键的工具,它允许Java代码与本地C/C++代码交互。JNI的使用场景广泛,包括优化性能、利用硬件特性、调用已有的C/C++库等。当涉及到Android调用JNI并返回自定义...

    I2CJNI.rar_Android jni_android_android i2c_android i2c通信 JNI_i2c

    在Android系统中,JNI(Java Native Interface)是一种技术,它允许Java代码和其他语言写的代码进行交互。本资源"I2CJNI.rar"似乎包含了一个实际应用的Android I2C通信示例,利用JNI来实现硬件级别的低层通信。I2C...

    JNI入门Demo3.0

    JNI(Java Native Interface)是Java平台提供的一种标准接口,它允许Java代码和其他语言写的代码进行交互。JNI在Android开发中尤为重要,特别是在需要调用C/C++原生代码以提升性能或者利用现有库时。本教程“JNI入门...

    jni中用多线程调用java代码

    JNI(Java Native Interface)是Java平台的标准组成部分,它允许Java代码和其他语言写的代码进行交互。在Android开发中,JNI常用于提升性能、调用系统库或者实现特定功能,如与C/C++库交互。本项目重点在于如何在JNI...

    jni层内存泄漏检测工具

    JNI层内存泄漏检测工具是针对Android应用开发中的一个重要问题——JNI内存泄漏的解决方案。JNI,全称为Java Native Interface,允许Java代码与其他编程语言(如C++)交互,从而利用其性能优势。然而,由于Java和C/...

    CTP的JNI封装

    上期技术的CTP接口的JNI封装: (1)网上也有一些实现,不过都挂羊头卖狗肉的,超级鄙视。 (2)testCTP是JAVA的Eclipse工程,执行CTPTest就可以调用起CTP的JNI接口,lib是testCTP工程依赖的jar包,熟悉JAVA的人导入这个...

    jni操作list集合,来存储对象

    JNI,全称Java Native Interface,是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。在Android开发中,JNI常被用来提高性能、调用系统底层库或实现特定功能,例如本例中的操作Java的list集合。在...

    android通过JNI访问硬件LED

    在Android系统中,Java Native Interface (JNI) 是一个关键组件,允许Java代码与其他语言(如C++或C)编写的代码进行交互。本项目聚焦于如何利用JNI来访问硬件资源,特别是控制LED设备。以下是对这个主题的详细阐述...

    jni返回对象数组例子

    Java Native Interface(JNI)是Java平台的标准组成部分,它允许Java代码和其他语言写的代码进行交互。在JNI中,我们可以编写C/C++代码来扩展Java应用程序,实现一些Java无法直接完成的功能,比如访问操作系统底层...

    android jni获取 Mac地址

    在Android开发中,JNI(Java Native Interface)是一种技术,允许Java代码和其他语言写的代码进行交互。当需要执行一些性能敏感或者Java无法直接处理的任务时,开发者通常会利用JNI调用C/C++原生代码。本话题关注的...

    JNI处理hashmap,string等对象的操作

    JNI,全称Java Native Interface,是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。JNI在很多场景下都是必要的,比如调用操作系统本地库、加速性能关键的代码或者实现与硬件设备的直接通信。在...

    jni4net-0.8.8.0.zip

    JNI是Java平台的一部分,允许Java代码和其他语言写的代码进行交互。jni4net简化了这个过程,使得开发者无需深入理解复杂的JNI接口。 标签“jni4net”、“java”、“dll”、“C#”揭示了主要涉及的技术领域。jni4net...

Global site tag (gtag.js) - Google Analytics