/*
* 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,全称Java Native Interface,是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。JNI在很多场景下非常有用,比如当需要利用已有的C或C++库,或者提升性能时,我们可以通过JNI将Java代码与本地...
JNI,全称Java Native Interface,是Java平台标准的一部分,它为Java代码和其他语言写的代码提供了一个接口。在Java应用程序中,JNI允许Java代码调用本地(非Java)代码,反之亦然,使得开发者能够利用Java的跨平台...
JNI,全称Java Native Interface,是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。JNI在很多场景下都是必要的,比如调用操作系统本地库、加速性能关键的代码或者利用硬件特性等。本文将深入...
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,全称Java Native Interface,是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。JNI在很多场景下非常有用,比如当需要利用已有的C/C++库或者优化性能时。本篇文章将深入探讨如何在JNI中传递...
Android 通过 JNI 调用.so 动态库 Android 通过 JNI(Java Native Interface)调用.so 动态库是 Android 开发中的一种常用技术。JNI 是一种允许 Java 代码与 native 代码之间进行交互的接口。通过 JNI,我们可以在 ...
JNI,全称Java Native Interface,是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。JNI在很多场景下都是必要的,比如当需要利用已有的C/C++库,或者为了性能优化而需要直接调用硬件接口时。在这...
Java JNI(Java Native Interface)是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。JNI在很多场景下被使用,比如优化性能、利用已有的C/C++库或者访问操作系统特定的功能。在这个"Java jni调用...
在Android开发中,Java Native Interface (JNI) 是一个关键的工具,它允许Java代码与本地C/C++代码交互。JNI的使用场景广泛,包括优化性能、利用硬件特性、调用已有的C/C++库等。当涉及到Android调用JNI并返回自定义...
在Android系统中,JNI(Java Native Interface)是一种技术,它允许Java代码和其他语言写的代码进行交互。本资源"I2CJNI.rar"似乎包含了一个实际应用的Android I2C通信示例,利用JNI来实现硬件级别的低层通信。I2C...
JNI(Java Native Interface)是Java平台提供的一种标准接口,它允许Java代码和其他语言写的代码进行交互。JNI在Android开发中尤为重要,特别是在需要调用C/C++原生代码以提升性能或者利用现有库时。本教程“JNI入门...
JNI(Java Native Interface)是Java平台的标准组成部分,它允许Java代码和其他语言写的代码进行交互。在Android开发中,JNI常用于提升性能、调用系统库或者实现特定功能,如与C/C++库交互。本项目重点在于如何在JNI...
JNI层内存泄漏检测工具是针对Android应用开发中的一个重要问题——JNI内存泄漏的解决方案。JNI,全称为Java Native Interface,允许Java代码与其他编程语言(如C++)交互,从而利用其性能优势。然而,由于Java和C/...
上期技术的CTP接口的JNI封装: (1)网上也有一些实现,不过都挂羊头卖狗肉的,超级鄙视。 (2)testCTP是JAVA的Eclipse工程,执行CTPTest就可以调用起CTP的JNI接口,lib是testCTP工程依赖的jar包,熟悉JAVA的人导入这个...
JNI,全称Java Native Interface,是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。在Android开发中,JNI常被用来提高性能、调用系统底层库或实现特定功能,例如本例中的操作Java的list集合。在...
在Android系统中,Java Native Interface (JNI) 是一个关键组件,允许Java代码与其他语言(如C++或C)编写的代码进行交互。本项目聚焦于如何利用JNI来访问硬件资源,特别是控制LED设备。以下是对这个主题的详细阐述...
Java Native Interface(JNI)是Java平台的标准组成部分,它允许Java代码和其他语言写的代码进行交互。在JNI中,我们可以编写C/C++代码来扩展Java应用程序,实现一些Java无法直接完成的功能,比如访问操作系统底层...
在Android开发中,JNI(Java Native Interface)是一种技术,允许Java代码和其他语言写的代码进行交互。当需要执行一些性能敏感或者Java无法直接处理的任务时,开发者通常会利用JNI调用C/C++原生代码。本话题关注的...
JNI,全称Java Native Interface,是Java平台标准的一部分,它允许Java代码和其他语言写的代码进行交互。JNI在很多场景下都是必要的,比如调用操作系统本地库、加速性能关键的代码或者实现与硬件设备的直接通信。在...
JNI是Java平台的一部分,允许Java代码和其他语言写的代码进行交互。jni4net简化了这个过程,使得开发者无需深入理解复杂的JNI接口。 标签“jni4net”、“java”、“dll”、“C#”揭示了主要涉及的技术领域。jni4net...