Android的jni的调用C,C++的几个应用(基本类型,数组,类(结构体))文档-源码
来源:互联网 发布:mp280清零软件 编辑:程序博客网 时间:2024/06/08 20:04
http://topic.csdn.net/u/20110509/00/a46cd0f1-85da-49e3-a51b-2e388c402d37.html
Android的jni的调用C,C++的几个应用(基本类型,数组,类(结构体))文档-源码
今天是母亲节,首先祝愿全天下的母亲健康长寿!永远年轻!天天快乐!
慈母手中线,游子身上衣,临行密密缝,意恐迟迟归,谁言寸草心,报得三春晖。
谢谢妈妈
开始正题啦,前些天在研究Andorid中Jni(Java Native Interface)的使用,
主要是在android中调用C、C++的方法,在网上也搜集了一些文档,源码等资料,非常感谢网友的提供的宝贵经验。
也是写下这个文章,希望可以帮助正在做这方面应用网友们,jni使用c语言。
一、首先软件环境要搭配好,本人使用的环境是
Android2.2的SDK+r4b的NDK,linux下的编译环境
1. Windows XP
2. VMware 7.1.3 build-324285 + Ubuntu 9.04中文版
3. Android SDK 2.2
4. Android NDK r4b Linux版(crystax),加入支持C++ exceptions, RTTI and Standard C++ Library
http://www.crystax.net/android/ndk-r4.php
http://www.crystax.net/data/android-ndk-r4-linux-x86-crystax-4.tar.bz2
5. Eclipse Version: 3.5.2
eclipse3.5.2官方下载地址
http://archive.eclipse.org/eclipse/downloads/drops/R-3.5.2-201002111343/eclipse-SDK-3.5.2-win32.zip
6.
二、配置好eclipse,并加入androiddSDK,然后通过eclipse建立一个android工程,搭建android的jni框架
1. Eclipse
File->New->Android Project
如果此地没有Android Project,可以通过File->New->Project...,在弹出的对话框中,选择(Android)
以下几项填写,其他的默认即可
Project name: AndroidJni
Build Target: Android 2.2
Application name: AndroidJni
Package name: com.jni
Create Activity: AndroidJni
Min SDK Version: 8
点击Finish即可
此时,我们就可以看到我们的项目了
在src->com.jni下自动生成的AndroidJni.java内容如下
我们在这里新建立一个class,比如命名jernymyjni,
这个作为我们的Jni的所有接口处,作为测试设计了基本类型,数组,和类(结构体),结构体数组等。
代码如下
今天是母亲节,首先祝愿全天下的母亲健康长寿!永远年轻!天天快乐!
慈母手中线,游子身上衣,临行密密缝,意恐迟迟归,谁言寸草心,报得三春晖。
谢谢妈妈
开始正题啦,前些天在研究Andorid中Jni(Java Native Interface)的使用,
主要是在android中调用C、C++的方法,在网上也搜集了一些文档,源码等资料,非常感谢网友的提供的宝贵经验。
也是写下这个文章,希望可以帮助正在做这方面应用网友们,jni使用c语言。
一、首先软件环境要搭配好,本人使用的环境是
Android2.2的SDK+r4b的NDK,linux下的编译环境
1. Windows XP
2. VMware 7.1.3 build-324285 + Ubuntu 9.04中文版
3. Android SDK 2.2
4. Android NDK r4b Linux版(crystax),加入支持C++ exceptions, RTTI and Standard C++ Library
http://www.crystax.net/android/ndk-r4.php
http://www.crystax.net/data/android-ndk-r4-linux-x86-crystax-4.tar.bz2
5. Eclipse Version: 3.5.2
eclipse3.5.2官方下载地址
http://archive.eclipse.org/eclipse/downloads/drops/R-3.5.2-201002111343/eclipse-SDK-3.5.2-win32.zip
6.
二、配置好eclipse,并加入androiddSDK,然后通过eclipse建立一个android工程,搭建android的jni框架
1. Eclipse
File->New->Android Project
如果此地没有Android Project,可以通过File->New->Project...,在弹出的对话框中,选择(Android)
以下几项填写,其他的默认即可
Project name: AndroidJni
Build Target: Android 2.2
Application name: AndroidJni
Package name: com.jni
Create Activity: AndroidJni
Min SDK Version: 8
点击Finish即可
此时,我们就可以看到我们的项目了
在src->com.jni下自动生成的AndroidJni.java内容如下
- Java code
- package com.jni;import android.app.Activity;import android.os.Bundle;public class AndroidJni extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); }}
我们在这里新建立一个class,比如命名jernymyjni,
这个作为我们的Jni的所有接口处,作为测试设计了基本类型,数组,和类(结构体),结构体数组等。
代码如下
- Java code
- package com.jni;// jernymy use c style for var namepublic class jernymyjni { char chChar; // char use ch token// short wShort; // short use w token, short same as int int nInt; // int use n token String sString; // String use s token /*-------- jernymy for base type declaration start --------*/ /* * The char process method GetChar * @param char chInput : the input char for process * @return(char) : input char (chInput) upper or lower * @author : jernymy * @date : 20110508 * */ public native char GetChar(char chInput); /* * The char process method SetChar * @param char chInput : set the input char * @return(int) : status, 0-OK, other-Error * @author : jernymy * @date : 20110508 * */ public native int SetChar(char chInput); /* * The int process method GetInt * @param int nAdd1 : add one * @param int nAdd2 : add other * @return(int) : sum of two add var * @author : jernymy * @date : 20110508 * */ public native int GetInt(int nAdd1, int nAdd2); /* * The int process method SetInt * @param int nSet : set one int data * @return(int) : status, 0-OK, other-Error * @author : jernymy * @date : 20110508 * */ public native int SetInt(int nSet); /* * The String process method GetStr * @return(String) : the string for use * @author : jernymy * @date : 20110508 * */ public native String GetStr(); /* * The String process method PrcsStr * @param String sInput : the input String for process * @return(String) : the process of the input String * @author : jernymy * @date : 20110508 * */ public native String PrcsStr(String sInput); /* * The String process method PrcsStr * @param String sSet : the set String * @return(int) : status, 0-OK, other-Error * @author : jernymy * @date : 20110508 * */ public native int SetStr(String sSet); /*-------- jernymy for base type declaration end --------*/ /*-------- jernymy for array type declaration start --------*/ /* * The char array process method GetCharArray * @param char chSet : the chSet char for process * @return(char[]) : char array, upper and lower * @author : jernymy * @date : 20110508 * */ public native char[] GetCharArray(char chSet); /* * The char array process method SetCharArray * @param char[] chSet : the chSet char array for process * @return(int) : status, 0-OK, other-Error * @author : jernymy * @date : 20110508 * */ public native int SetCharArray(char[] chSet); /* * The int array process method GetIntArray * @param int[] nAdd1 : add one array * @param int[] nAdd2 : add other array * @return(int[]) : sum array of two add array var * @author : jernymy * @date : 20110508 * */ public native int[] GetIntArray(int[] nAdd1, int[] nAdd2); /* * The int array process method SetIntArray * @param int[] nSet : set one int array data * @return(int) : status, 0-OK, other-Error * @author : jernymy * @date : 20110508 * */ public native int SetIntArray(int[] nSet); /* * The String array process method GetStrArray * @return(String[]) : String array with null parameter * @author : jernymy * @date : 20110508 * */ public native String[] GetStrArray(); /* * The String array process method PrcsStrArray * @param String sSet : the string with " " token sSet * @return(String[]) : ervey string by " " token * @author : jernymy * @date : 20110508 * */ public native String[] PrcsStrArray(String sSet); /* * The String array process method SetStrArray * @param String[] sSet : set the string array * @return(int) : status, 0-OK, other-Error * @author : jernymy * @date : 20110508 * */ public native int SetStrArray(String[] sSet); /*-------- jernymy for array type declaration end --------*/ /*-------- jernymy for class(struct) type declaration start --------*/ /* * The jernymyjni class(struct) process method GetClass * @param int nIdx : get class data by index * @return(jernymyjni) : status, 0-OK, other-Error * @author : jernymy * @date : 20110508 * */ public native jernymyjni GetClass(int nIdx); /* * The jernymyjni class(struct) process method SetClass * @param jernymyjni cClass : set class data by class index * @return(int) : status, 0-OK, other-Error * @author : jernymy * @date : 20110508 * */ public native int SetClass(jernymyjni cClass); /*-------- jernymy for class(struct) type declaration end --------*/ /*-------- jernymy for class(struct) array type declaration start --------*/ /* * The jernymyjni class(struct) array process method GetClassArray * @return(jernymyjni[]) : class array data * @author : jernymy * @date : 20110508 * */ public native jernymyjni[] GetClassArray(); /* * The jernymyjni class(struct) array process method SetClassArray * @param jernymyjni[] cNcomnAry : set class array data * @return(int) : status, 0-OK, other-Error * @author
- 对我有用[0]
- 丢个板砖[0]
- 引用
- 举报
- 管理
- TOP
- jernymy
- (俺们那个都是东北人)
- 等 级:
#1楼 得分:0回复于:2011-05-09 00:55:13
通过eclipse的生成对应的class文件,会在AndroidJni\bin下生成所有的文件
然后进入windowsXP的command模式
开始->运行->cmd
到我们的项目的所在目录,我的目录为
运行javah,得到对应的jni的头文件
E:\work\jave\workspace\AndroidJni>javah -classpath bin com.jni.jernymyjni
E:\work\jave\workspace\AndroidJni>
此时会在当前目录下生成一个com_jni_jernymyjni.h,好了,就是它了,接下来开始编写它对应的c文件了。
为了符合android的文档规范,我们需要在当前目录(AndroidJni)下先建立一个jni目录,然后再建立一个Android.mk
然后把com_jni_jernymyjni.h文件copy到jni目录下。
E:\work\jave\workspace\AndroidJni>cd jni
E:\work\jave\workspace\AndroidJni\jni>dir
驱动器 E 中的卷是 work
卷的序列号是 1C8F-CA73
E:\work\jave\workspace\AndroidJni\jni 的目录
2011-05-08 23:09 <DIR> .
2011-05-08 23:09 <DIR> ..
2011-05-08 23:08 0 Android.mk
2011-05-08 22:58 3,802 com_jni_jernymyjni.h
2 个文件 3,802 字节
2 个目录 10,864,427,008 可用字节
E:\work\jave\workspace\AndroidJni\jni>
com_jni_jernymyjni.h的文件内容
- C/C++ code
- /* DO NOT EDIT THIS FILE - it is machine generated */#include <jni.h>/* Header for class com_jni_jernymyjni */#ifndef _Included_com_jni_jernymyjni#define _Included_com_jni_jernymyjni#ifdef __cplusplusextern "C" {#endif/* * Class: com_jni_jernymyjni * Method: GetChar * Signature: (C)C */JNIEXPORT jchar JNICALL Java_com_jni_jernymyjni_GetChar (JNIEnv *, jobject, jchar);/* * Class: com_jni_jernymyjni * Method: SetChar * Signature: (C)I */JNIEXPORT jint JNICALL Java_com_jni_jernymyjni_SetChar (JNIEnv *, jobject, jchar);/* * Class: com_jni_jernymyjni * Method: GetInt * Signature: (II)I */JNIEXPORT jint JNICALL Java_com_jni_jernymyjni_GetInt (JNIEnv *, jobject, jint, jint);/* * Class: com_jni_jernymyjni * Method: SetInt * Signature: (I)I */JNIEXPORT jint JNICALL Java_com_jni_jernymyjni_SetInt (JNIEnv *, jobject, jint);/* * Class: com_jni_jernymyjni * Method: GetStr * Signature: ()Ljava/lang/String; */JNIEXPORT jstring JNICALL Java_com_jni_jernymyjni_GetStr (JNIEnv *, jobject);/* * Class: com_jni_jernymyjni * Method: PrcsStr * Signature: (Ljava/lang/String;)Ljava/lang/String; */JNIEXPORT jstring JNICALL Java_com_jni_jernymyjni_PrcsStr (JNIEnv *, jobject, jstring);/* * Class: com_jni_jernymyjni * Method: SetStr * Signature: (Ljava/lang/String;)I */JNIEXPORT jint JNICALL Java_com_jni_jernymyjni_SetStr (JNIEnv *, jobject, jstring);/* * Class: com_jni_jernymyjni * Method: GetCharArray * Signature: (C)[C */JNIEXPORT jcharArray JNICALL Java_com_jni_jernymyjni_GetCharArray (JNIEnv *, jobject, jchar);/* * Class: com_jni_jernymyjni * Method: SetCharArray * Signature: ([C)I */JNIEXPORT jint JNICALL Java_com_jni_jernymyjni_SetCharArray (JNIEnv *, jobject, jcharArray);/* * Class: com_jni_jernymyjni * Method: GetIntArray * Signature: ([I[I)[I */JNIEXPORT jintArray JNICALL Java_com_jni_jernymyjni_GetIntArray (JNIEnv *, jobject, jintArray, jintArray);/* * Class: com_jni_jernymyjni * Method: SetIntArray * Signature: ([I)I */JNIEXPORT jint JNICALL Java_com_jni_jernymyjni_SetIntArray (JNIEnv *, jobject, jintArray);/* * Class: com_jni_jernymyjni * Method: GetStrArray * Signature: ()[Ljava/lang/String; */JNIEXPORT jobjectArray JNICALL Java_com_jni_jernymyjni_GetStrArray (JNIEnv *, jobject);/* * Class: com_jni_jernymyjni * Method: PrcsStrArray * Signature: (Ljava/lang/String;)[Ljava/lang/String; */JNIEXPORT jobjectArray JNICALL Java_com_jni_jernymyjni_PrcsStrArray (JNIEnv *, jobject, jstring);/* * Class: com_jni_jernymyjni * Method: SetStrArray * Signature: ([Ljava/lang/String;)I */JNIEXPORT jint JNICALL Java_com_jni_jernymyjni_SetStrArray (JNIEnv *, jobject, jobjectArray);/* * Class: com_jni_jernymyjni * Method: GetClass * Signature: (I)Lcom/jni/jernymyjni; */JNIEXPORT jobject JNICALL Java_com_jni_jernymyjni_GetClass (JNIEnv *, jobject, jint);/* * Class: com_jni_jernymyjni * Method: SetClass * Signature: (Lcom/jni/jernymyjni;)I */JNIEXPORT jint JNICALL Java_com_jni_jernymyjni_SetClass (JNIEnv *, jobject, jobject);/* * Class: com_jni_jernymyjni * Method: GetClassArray * Signature: ()[Lcom/jni/jernymyjni; */JNIEXPORT jobjectArray JNICALL Java_com_jni_jernymyjni_GetClassArray (JNIEnv *, jobject);/* * Class: com_jni_jernymyjni * Method: SetClassArray * Signature: ([Lcom/jni/jernymyjni;)I */JNIEXPORT jint JNICALL Java_com_jni_jernymyjni_SetClassArray (JNIEnv *, jobject, jobjectArray);#ifdef __cplusplus}#endif#endif
- 对我有用[0]
- 丢个板砖[0]
- 引用
- 举报
- 管理
- TOP
精华推荐:win32中如何封装一个自己的对话框
- jernymy
- (俺们那个都是东北人)
- 等 级:
#2楼 得分:0回复于:2011-05-09 00:56:40
com_jni_jernymyjni.c的文件内容
- C/C++ code
- #include "com_jni_jernymyjni.h"#include "stdio.h" // printf#include "string.h" // strlen, memset...#define JNI_ERR_NULL_CLASS 0x10#define JNI_ERR_NULL_CHAR 0x11#define JNI_ERR_NULL_INT 0x12#define JNI_ERR_NULL_STR 0x13#define JNI_ERR_NULL_OBJ 0x14#define JNI_ERR_NULL_FIELD_CHAR 0x15#define JNI_ERR_NULL_FIELD_INT 0x16#define JNI_ERR_NULL_FIELD_OBJ 0x17#define JNI_ERR_NULL_STR_UTF_C 0x18#define JNI_ERR_NULL_OBJ_ARY_ELEMENT 0x19#define JNI_ERR_NULL_METHOD 0x20#define JNI_DBG printf("[C]-File:%s, Line:%d\n", __FILE__, __LINE__);#define JNI_ASSERT_P_RTN_VAR(var, rtn)\ if (NULL == var)\ {\ printf("[C]-File:%s, Line:%d, %s==NULL\n", __FILE__, __LINE__, #var);\ return rtn;\ }#define JNI_ASSERT_V_RTN_VAR(var, rtn)\ if (0 == var)\ {\ printf("[C]-File:%s, Line:%d, %s==NULL\n", __FILE__, __LINE__, #var);\ return rtn;\ }FILE *fpJniDbg = NULL;// A[65], a[97]// (chA1 & (~0x20)) = tower, (chA1 | 0x20)upperJNIEXPORT jchar JNICALL Java_com_jni_jernymyjni_GetChar (JNIEnv *jpcEnv, jobject jcObj, jchar jchInput){ if (jchInput >= 'a' && jchInput <= 'z') { return (jchInput & (~0x20)); } else if (jchInput >= 'A' && jchInput <= 'Z') { return (jchInput | 0x20); } return 0;}JNIEXPORT jint JNICALL Java_com_jni_jernymyjni_SetChar (JNIEnv *jpcEnv, jobject jcObj, jchar jchSet){ printf("[C]-Line:%d-Java_com_jni_jernymyjni_SetChar-jchSet:%c\n", __LINE__, jchSet); return 0;}JNIEXPORT jint JNICALL Java_com_jni_jernymyjni_GetInt (JNIEnv *jpcEnv, jobject jcObj, jint jnAdd1, jint jnAdd2){ return (jnAdd1 + jnAdd2);}JNIEXPORT jint JNICALL Java_com_jni_jernymyjni_SetInt (JNIEnv *jpcEnv, jobject jcObj, jint jnSet){ printf("[C]-Line:%d-Java_com_jni_jernymyjni_SetInt-jnSet:%d\n", __LINE__, jnSet); return 0;}JNIEXPORT jstring JNICALL Java_com_jni_jernymyjni_GetStr (JNIEnv *jpcEnv, jobject jcObj){ char *pachStr = {"Jernymy jni test"}; return (*jpcEnv)->NewStringUTF(jpcEnv, pachStr);}JNIEXPORT jstring JNICALL Java_com_jni_jernymyjni_PrcsStr (JNIEnv *jpcEnv, jobject jcObj, jstring jsStr){ int nLen = 0; char achBuf[128] = {0}; const char *lpcstrGet = (*jpcEnv)->GetStringUTFChars(jpcEnv, jsStr, 0); nLen = strlen(lpcstrGet); nLen = (nLen > 127) ? 127 : nLen; strncpy(achBuf, lpcstrGet, nLen); (*jpcEnv)->ReleaseStringUTFChars(jpcEnv, jsStr, lpcstrGet); while (nLen--) { // swicth to upper, to lower (a &(~0x20)) achBuf[nLen] = achBuf[nLen] | 0x20; } return (*jpcEnv)->NewStringUTF(jpcEnv, achBuf);}JNIEXPORT jint JNICALL Java_com_jni_jernymyjni_SetStr (JNIEnv *jpcEnv, jobject jcObj, jstring jsStr){ const char *lpcstrGet = (*jpcEnv)->GetStringUTFChars(jpcEnv, jsStr, 0); JNI_ASSERT_P_RTN_VAR(lpcstrGet, -1); printf("[C]-Line:%d-Java_com_jni_jernymyjni_SetStr-jsStr:%s\n", __LINE__, lpcstrGet); // release for memory (*jpcEnv)->ReleaseStringUTFChars(jpcEnv, jsStr, lpcstrGet); return 0;}#define CHAR_NUM 2JNIEXPORT jcharArray JNICALL Java_com_jni_jernymyjni_GetCharArray (JNIEnv *jpcEnv, jobject jcObj, jchar jchChar){ jobjectArray joArray = 0; jchar achBuf[CHAR_NUM] = {0}; achBuf[0] = jchChar & (~0x20); // 'a' achBuf[1] = jchChar | 0x20; // 'A' joArray = (*jpcEnv)->NewCharArray(jpcEnv, CHAR_NUM); JNI_ASSERT_P_RTN_VAR(joArray, NULL); (*jpcEnv)->SetCharArrayRegion(jpcEnv, joArray, 0, 2, achBuf); return joArray;}JNIEXPORT jint JNICALL Java_com_jni_jernymyjni_SetCharArray (JNIEnv *jpcEnv, jobject jcObj, jcharArray jchCharArray){ jsize jsLen = (*jpcEnv)->GetArrayLength(jpcEnv, jchCharArray); // get array length printf("[C]-Line:%d-Java_com_jni_jernymyjni_SetCharArray-jsLen:%d,jchCharArray:%p\n", __LINE__, jsLen, jchCharArray); return 0;}JNIEXPORT jintArray JNICALL Java_com_jni_jernymyjni_GetIntArray (JNIEnv *jpcEnv, jobject jcObj, jintArray jiAry1, jintArray jiAry2){ int nIdx; jint nSum[10] = {0}; jobjectArray joArray = 0; jsize jsLen = (*jpcEnv)->GetArrayLength(jpcEnv, jiAry1); // get array length jint *jpIAry1 = (*jpcEnv)->GetIntArrayElements(jpcEnv, jiAry1, 0); // get array element pointer jint *jpIAry2 = (*jpcEnv)->GetIntArrayElements(jpcEnv, jiAry2, 0); // get array element pointer // the value is now valid, so return NULL JNI_ASSERT_V_RTN_VAR(jsLen, NULL); JNI_ASSERT_P_RTN_VAR(jpIAry1, NULL); JNI_ASSERT_P_RTN_VAR(jpIAry2, NULL); printf("[C]-Line:%d-Java_com_jni_jernymyjni_GetIntArray-jiAry1 length:%d\n", __LINE__, jsLen); joArray = (*jpcEnv)->NewIntArray(jpcEnv, jsLen); JNI_ASSERT_P_RTN_VAR(joArray, NULL); for (nIdx = 0; nIdx < jsLen; nIdx++) { nSum[nIdx] = jpIAry1[nIdx] + jpIAry2[nIdx]; // add every array element printf("[C]-nSum:%d=%d+%d\n", nSum[nIdx], jpIAry1[nIdx], jpIAry2[nIdx]); } (*jpcEnv)->SetIntArrayRegion(jpcEnv, joArray, 0, jsLen, nSum); (*jpcEnv)->ReleaseIntArrayElements(jpcEnv, jiAry1, jpIAry1, 0); // release, do not forget (*jpcEnv)->ReleaseIntArrayElements(jpcEnv, jiAry2, jpIAry2, 0); // release, do not forget return joArray;}JNIEXPORT jint JNICALL Java_com_jni_jernymyjni_SetIntArray (JNIEnv *jpcEnv, jobject jcObj, jintArray jiAry1){ int nIdx; jsize jsLen = (*jpcEnv)->GetArrayLength(jpcEnv, jiAry1); // get array length jint *jpIAry1 = (*jpcEnv)->GetIntArrayElements(jpcEnv, jiAry1, 0); // get array pointer JNI_ASSERT_V_RTN_VAR(jsLen, 0); JNI_ASSERT_P_RTN_VAR(jpIAry1, 0); printf("[C]-Line:%d-Java_com_jni_jernymyjni_GetIntArray-jiAry1 length:%d\n", __LINE__, jsLen); for (nIdx = 0; nIdx < jsLen; nIdx++) { printf("[C]-Index:%d, jpIAry1:%d\n", nIdx, jpIAry1[nIdx]); } (*jpcEnv)->ReleaseIntArrayElements(jpcEnv, jiAry1, jpIAry1, 0); // release, do not forget return 0;}#define JNI_STR_ARRAY_NUM 3JNIEXPORT jobjectArray JNICALL Java_com_jni_jernymyjni_GetStrArray (JNIEnv *jpcEnv, jobject jcObj){ jstring jsStr = 0; jclass jcStrCls = 0; jobjectArray joArray = 0; int nIdx = 0; char *pachStr[JNI_STR_ARRAY_NUM] = {"Jernymy", "Jni ", "Test"}; jcStrCls = (*jpcEnv)->FindClass(jpcEnv, "java/lang/String"); JNI_ASSERT_P_RTN_VAR(jcStrCls, NULL); joArray = (*jpcEnv)->NewObjectArray(jpcEnv, JNI_STR_ARRAY_NUM, jcStrCls, 0); JNI_ASSERT_P_RTN_VAR(joArray, NULL); for (; nIdx< JNI_STR_ARRAY_NUM; nIdx++) { jsStr = (*jpcEnv)->NewStringUTF(jpcEnv, pachStr[nIdx]); JNI_ASSERT_P_RTN_VAR(jsStr, NULL); (*jpcEnv)->SetObjectArrayElement(jpcEnv, joArray, nIdx, jsStr); } return joArray;}JNIEXPORT jobjectArray JNICALL Java_com_jni_jernymyjni_PrcsStrArray (JNIEnv *jpcEnv, jobject jcObj, jstring jsString){ jobjectArray joArray = 0; jclass jcStrCls; jstring jsCurStr; const char *lpcstrGet; const char *lpcstrBk; char *pchStr; char achStrBuf[128] = {0}; int nIndex = 0; pchStr = achStrBuf; #ifdef WIN32 // OK success - win32 system // win32 "java/lang/String" and "Ljava/lang/String;" both OK// jclass jcStrCls = (*jpcEnv)->FindClass(jpcEnv, "java/lang/String"); jcStrCls = (*jpcEnv)->FindClass(jpcEnv, "Ljava/lang/String;");#else // linux here must "java/lang/String" jcStrCls = (*jpcEnv)->FindClass(jpcEnv, "java/lang/String");/*----get string array:Exception in thread "main" java.lang.ClassNotFoundException: Ljava.lang.String; not found in gnu.gcj.runtime.SystemClassLoader{urls=[file:./], parent=gnu.gcj.runtime.ExtensionClassLoader{urls=[], parent=null}} at java.net.URLClassLoader.findClass(libgcj.so.7rh) at gnu.gcj.runtime.SystemClassLoader.findClass(libgcj.so.7rh) at java.lang.ClassLoader.loadClass(libgcj.so.7rh) at java.lang.ClassLoader.loadClass(libgcj.so.7rh)[yewu@localhost src]$ */// jclass jcStrCls = (*jpcEnv)->FindClass(jpcEnv, "Ljava/lang/String;");#endif JNI_ASSERT_P_RTN_VAR(jcStrCls, NULL); joArray = (*jpcEnv)->NewObjectArray(jpcEnv, 3, jcStrCls, 0); JNI_ASSERT_P_RTN_VAR(joArray, NULL); lpcstrGet = (*jpcEnv)->GetStringUTFChars(jpcEnv, jsString, 0); JNI_ASSERT_P_RTN_VAR(lpcstrGet, NULL); lpcstrBk = lpcstrGet; printf("[C]-lpcstrGet:%s\n", lpcstrGet); while (*lpcstrGet) { if (' ' == *lpcstrGet) { nIndex++; lpcstrGet++; printf("[C]-achStrBuf:%s\n", achStrBuf); jsCurStr = (*jpcEnv)->NewStringUTF(jpcEnv, achStrBuf); JNI_ASSERT_P_RTN_VAR(jsCurStr, NULL); (*jpcEnv)->SetObjectArrayElement(jpcEnv, joArray, nIndex-1, jsCurStr); memset(&achStrBuf, 0, 128); pchStr = &achStrBuf[0]; } else { *pchStr++ = *lpcstrGet++; } } if (achStrBuf[0]) { printf("[C]-achStrBuf:%s\n", achStrBuf); jsCurStr = (*jpcEnv)->NewStringUTF(jpcEnv, achStrBuf); JNI_ASSERT_P_RTN_VAR(jsCurStr, NULL); (*jpcEnv)->SetObjectArrayElement(jpcEnv, joArray, nIndex, jsCurStr); } (*jpcEnv)->ReleaseStringUTFChars(jpcEnv, jsString, lpcstrBk); return joArray;}
- 对我有用[0]
- 丢个板砖[0]
- 引用
- 举报
- 管理
- TOP
精华推荐:全裸体攒机方案~太有才了!
- jernymy
- (俺们那个都是东北人)
- 等 级:
#3楼 得分:0回复于:2011-05-09 00:56:57
- C/C++ code
JNIEXPORT jint JNICALL Java_com_jni_jernymyjni_SetStrArray (JNIEnv *jpcEnv, jobject jcObj, jobjectArray jcObjAry) { int nIdx; const char *lpcstrGet; jobject jcObjCur; int nLen = (*jpcEnv)->GetArrayLength(jpcEnv, jcObjAry); JNI_ASSERT_V_RTN_VAR(nLen, 0); printf("[C]-jcObjAry length:%d\n", nLen); for (nIdx = 0; nIdx < nLen; nIdx++) { jcObjCur = (*jpcEnv)->GetObjectArrayElement(jpcEnv, jcObjAry, nIdx); JNI_ASSERT_P_RTN_VAR(jcObjCur, 0); lpcstrGet = (*jpcEnv)->GetStringUTFChars(jpcEnv, (jstring)jcObjCur, 0 ); JNI_ASSERT_P_RTN_VAR(lpcstrGet, 0); printf("[C]-index[%d] lpcstrGet:%s\n", nIdx, lpcstrGet); (*jpcEnv)->ReleaseStringUTFChars(jpcEnv, jcObjCur, lpcstrGet); } printf("[C]-\n"); return 0; } JNIEXPORT jobject JNICALL Java_com_jni_jernymyjni_GetClass (JNIEnv *jpcEnv, jobject jcObj, jint jnIdx) { char achBuf[32] = {0}; jclass jcStruct; jfieldID jchChar; jfieldID jnInt; jfieldID jsString; jstring jsStr; jobject joCurObj; jmethodID jmId; jcStruct = (*jpcEnv)->FindClass(jpcEnv, "com/jni/jernymyjni"); JNI_ASSERT_P_RTN_VAR(jcStruct, NULL); jchChar = (*jpcEnv)->GetFieldID(jpcEnv, jcStruct, "chChar", "C"); JNI_ASSERT_P_RTN_VAR(jchChar, NULL); jnInt = (*jpcEnv)->GetFieldID(jpcEnv, jcStruct, "nInt", "I"); JNI_ASSERT_P_RTN_VAR(jnInt, NULL); #ifdef WIN32 jsString = (*jpcEnv)->GetFieldID(jpcEnv, jcStruct, "sString", "Ljava/lang/String;"); #else jsString = (*jpcEnv)->GetFieldID(jpcEnv, jcStruct, "sString", "Ljava/lang/String;"); //jsString = (*jpcEnv)->GetFieldID(jpcEnv, jcStruct, "sString", "java/lang/String"); #endif JNI_ASSERT_P_RTN_VAR(jsString, NULL); // get class init method jmId = (*jpcEnv)->GetMethodID(jpcEnv, jcStruct, " <init>", "()V"); JNI_ASSERT_P_RTN_VAR(jsString, NULL); joCurObj = (*jpcEnv)->NewObject(jpcEnv, jcStruct, jmId); JNI_ASSERT_P_RTN_VAR(joCurObj, NULL); (*jpcEnv)->SetCharField(jpcEnv, joCurObj, jchChar, (char)(1+'d')); (*jpcEnv)->SetIntField(jpcEnv, joCurObj, jnInt, 0); sprintf(achBuf, "****sString[%d]%c", 0, 0); jsStr = (*jpcEnv)->NewStringUTF(jpcEnv, achBuf); JNI_ASSERT_P_RTN_VAR(jsStr, NULL); (*jpcEnv)->SetObjectField(jpcEnv, joCurObj, jsString, jsStr); printf("[C]-----%d, %c, %s\n", 0, 1+'0', achBuf); return joCurObj; } JNIEXPORT jint JNICALL Java_com_jni_jernymyjni_SetClass (JNIEnv *jpcEnv, jobject jcObj, jobject jcSetStruct) { const char *lpcstrGet; jchar jchData; jint jnData; jobject jcObjStr; jfieldID jchChar; jfieldID jnInt; jfieldID jsString; jclass jcStruct; // here is the class name, java file create a com_jni_jernymyjni class, so name is jcStruct = (*jpcEnv)->FindClass(jpcEnv, "com/jni/jernymyjni"); JNI_ASSERT_P_RTN_VAR(jcStruct, JNI_ERR_NULL_CLASS); // char sig is "C", see the .h file, Signature: (C)[C jchChar = (*jpcEnv)->GetFieldID(jpcEnv, jcStruct, "chChar", "C"); JNI_ASSERT_P_RTN_VAR(jchChar, JNI_ERR_NULL_CHAR); // int sig is "I", see the .h file, Signature: ([I[I)[I jnInt = (*jpcEnv)->GetFieldID(jpcEnv, jcStruct, "nInt", "I"); JNI_ASSERT_P_RTN_VAR(jnInt, JNI_ERR_NULL_INT); // string, see the .h file, Signature: (Ljava/lang/String;)[Ljava/lang/String; jsString = (*jpcEnv)->GetFieldID(jpcEnv, jcStruct, "sString", "Ljava/lang/String;"); JNI_ASSERT_P_RTN_VAR(jsString, JNI_ERR_NULL_STR); // get char field information jchData = (*jpcEnv)->GetCharField(jpcEnv, jcSetStruct, jchChar); printf("[C]-jchData:%c\n", jchData); // get int field information jnData = (*jpcEnv)->GetIntField(jpcEnv, jcSetStruct, jnInt); printf("[C]-jnData:%d\n", jnData); // get object field , now is string information jcObjStr = (*jpcEnv)->GetObjectField(jpcEnv, jcSetStruct, jsString); JNI_ASSERT_P_RTN_VAR(jcObjStr, JNI_ERR_NULL_FIELD_OBJ); // get const char information from jstring lpcstrGet = (*jpcEnv)->GetStringUTFChars(jpcEnv, (jstring)jcObjStr, 0); JNI_ASSERT_P_RTN_VAR(lpcstrGet, JNI_ERR_NULL_STR_UTF_C); printf("[C]-lpcstrGet:%s\n", lpcstrGet); // release const char information from jstring (*jpcEnv)->ReleaseStringUTFChars(jpcEnv, jcObjStr, lpcstrGet); printf("[C]-\n"); return 0; } #define STRUCT_ARRAY_NUM 3 JNIEXPORT jobjectArray JNICALL Java_com_jni_jernymyjni_GetClassArray (JNIEnv *jpcEnv, jobject jcObj) { int nIdx; char achBuf[32] = {0}; jclass jcStruct; jobjectArray jcAry; jfieldID jnInt; jfieldID jchChar; jfieldID jsString; jstring jsStr; jobject joCurObj; jmethodID jmId; // here is the class name, java file create a com_jni_jernymyjni class, so name is jcStruct = (*jpcEnv)->FindClass(jpcEnv, "com/jni/jernymyjni"); JNI_ASSERT_P_RTN_VAR(jcStruct, NULL); // how many array will create, now is 3, and init is 0; jcAry = (*jpcEnv)->NewObjectArray(jpcEnv, STRUCT_ARRAY_NUM, jcStruct, 0); JNI_ASSERT_P_RTN_VAR(jcAry, NULL); // char sig is "C", see the .h file, Signature: (C)[C jchChar = (*jpcEnv)->GetFieldID(jpcEnv, jcStruct, "chChar", "C"); JNI_ASSERT_P_RTN_VAR(jchChar, NULL); // int sig is "I", see the .h file, Signature: ([I[I)[I jnInt = (*jpcEnv)->GetFieldID(jpcEnv, jcStruct, "nInt", "I"); JNI_ASSERT_P_RTN_VAR(jnInt, NULL); // string, see the .h file, Signature: (Ljava/lang/String;)[Ljava/lang/String; jsString = (*jpcEnv)->GetFieldID(jpcEnv, jcStruct, "sString", "Ljava/lang/String;"); JNI_ASSERT_P_RTN_VAR(jsString, NULL); // get class method, 得到类的构造函数 jmId = (*jpcEnv)->GetMethodID(jpcEnv, jcStruct, " <init>", "()V"); JNI_ASSERT_P_RTN_VAR(jmId, NULL); for (nIdx = 0; nIdx < STRUCT_ARRAY_NUM; nIdx++) { // create a new object area, like malloc or alloc buffer joCurObj = (*jpcEnv)->NewObject(jpcEnv, jcStruct, jmId); JNI_ASSERT_P_RTN_VAR(joCurObj, NULL); // set the char value (*jpcEnv)->SetCharField(jpcEnv, joCurObj, jchChar, (char)(nIdx+'a')); // set the int value (*jpcEnv)->SetIntField(jpcEnv, joCurObj, jnInt, nIdx); sprintf(achBuf, "****sString[%d]%c", nIdx, 0); // get jstring with achBuf jsStr = (*jpcEnv)->NewStringUTF(jpcEnv, achBuf); JNI_ASSERT_P_RTN_VAR(jsStr, NULL); // set the string value (*jpcEnv)->SetObjectField(jpcEnv, joCurObj, jsString, jsStr); printf("[C]-Line:%d-Java_com_jni_jernymyjni_GetClassArray\n", __LINE__); printf("[C]-----%d, %c, %s\n", nIdx, 'd', achBuf); // set all struct value with index (*jpcEnv)->SetObjectArrayElement(jpcEnv, jcAry, nIdx, joCurObj); } return jcAry; } JNIEXPORT jint JNICALL Java_com_jni_jernymyjni_SetClassArray (JNIEnv *jpcEnv, jobject jcObj, jobjectArray jcObjAry) { int nIdx; const char *lpcstrGet; jobject jcObjCur; jchar jchData; jint jnData; jobject jcObjStr; jfieldID jchChar; jfieldID jnInt; jfieldID jsString; jclass jcStruct; int nLen = (*jpcEnv)->GetArrayLength(jpcEnv, jcObjAry); // here is the class name, java file create a com_jni_jernymyjni class, so name is jcStruct = (*jpcEnv)->FindClass(jpcEnv, "com/jni/jernymyjni"); JNI_ASSERT_P_RTN_VAR(jcStruct, JNI_ERR_NULL_CLASS); // char sig is "C", see the .h file, Signature: (C)[C jchChar = (*jpcEnv)->GetFieldID(jpcEnv, jcStruct, "chChar", "C"); // int sig is "I", see the .h file, Signature: ([I[I)[I jnInt = (*jpcEnv)->GetFieldID(jpcEnv, jcStruct, "nInt", "I"); JNI_ASSERT_P_RTN_VAR(jnInt, JNI_ERR_NULL_INT); // string, see the .h file, Signature: (Ljava/lang/String;)[Ljava/lang/String; jsString = (*jpcEnv)->GetFieldID(jpcEnv, jcStruct, "sString", "Ljava/lang/String;"); JNI_ASSERT_P_RTN_VAR(jsString, JNI_ERR_NULL_STR); printf("[C]-jcObjAry length:%d\n", nLen); for (nIdx = 0; nIdx < nLen; nIdx++) { printf("[C]-index[%d]", nIdx); // get every object information jcObjCur = (*jpcEnv)->GetObjectArrayElement(jpcEnv, jcObjAry, nIdx); JNI_ASSERT_P_RTN_VAR(jcObjStr, JNI_ERR_NULL_OBJ_ARY_ELEMENT); // get char field information jchData = (*jpcEnv)->GetCharField(jpcEnv, jcObjCur, jchChar); //JNI_ASSERT_V_RTN_VAR(jchData, JNI_ERR_NULL_FIELD_CHAR); printf("[C]-jchData:%c\n", jchData); // get int field information jnData = (*jpcEnv)->GetIntField(jpcEnv, jcObjCur, jnInt); printf("[C]-jnData:%d\n", jnData); // get object field , now is string information jcObjStr = (*jpcEnv)->GetObjectField(jpcEnv, jcObjCur, jsString); JNI_ASSERT_P_RTN_VAR(jcObjStr, JNI_ERR_NULL_FIELD_OBJ); // get const char information from jstring lpcstrGet = (*jpcEnv)->GetStringUTFChars(jpcEnv, (jstring)jcObjStr, 0); JNI_ASSERT_P_RTN_VAR(lpcstrGet, JNI_ERR_NULL_STR_UTF_C); printf("[C]-lpcstrGet:%s\n", lpcstrGet); // release const char information from jstring (*jpcEnv)->ReleaseStringUTFChars(jpcEnv, jcObjStr, lpcstrGet); } printf("[C]-\n"); return 0; }
- 对我有用[0]
- 丢个板砖[0]
- 引用
- 举报
- 管理
- TOP
精华推荐:如何让程序适应各种屏幕的大小?
- DrSmart
- (斯玛特)
- 等 级:
#4楼 得分:10回复于:2011-05-09 10:32:03
晕,你用google英文搜索下就行了, 教程很多的,
- 对我有用[0]
- 丢个板砖[0]
- 引用
- 举报
- 管理
- TOP
精华推荐:让你嘴巴合不拢的★★超酷★★创意集锦
- jnet007
- (学习)
- 等 级:
#7楼 得分:0回复于:2011-05-09 10:42:31
static
{
System.loadLibrary( "jernymyjni "); // jernymy here is the so name
}
LZ还在吗?,我想问下这个jernymyjni你是怎么生成的(是用c c++生成的吗?),要放在哪里?
还有如果是linux系统那么放在哪里才能加载呀。。。。??????
{
System.loadLibrary( "jernymyjni "); // jernymy here is the so name
}
LZ还在吗?,我想问下这个jernymyjni你是怎么生成的(是用c c++生成的吗?),要放在哪里?
还有如果是linux系统那么放在哪里才能加载呀。。。。??????
- 对我有用[0]
- 丢个板砖[0]
- 引用
- 举报
- 管理
- TOP
- jernymy
- (俺们那个都是东北人)
- 等 级:
#9楼 得分:0回复于:2011-05-09 12:15:21
编写Android.mk,内容如下
在VMware的ubuntu9.04下编译, NDK r4b的路径在../bld/android-ndk-r4-crystax,使用该ndkbuild
root@jernymy-desktop:/mnt/hgfs/workspace/AndroidJni# ../bld/android-ndk-r4-crystax/ndk-build
Compile thumb : jernymyjni <= /mnt/hgfs/workspace/AndroidJni/jni/com_jni_jernymyjni.c
SharedLibrary : libjernymyjni.so
Install : libjernymyjni.so => /mnt/hgfs/workspace/AndroidJni/libs/armeabi
root@jernymy-desktop:/mnt/hgfs/workspace/AndroidJni#
接下来编写我们的java的测试代码AndroidJni.java,目前为了方便调试,暂且用System.out输出,
可以通过android在界面上摆放一些button,然后把信息显示到button上,就可以看到效果了
现在可以先通过调试的方式,查看debug的信息。
好了,基本差不多了,因为俺暂时使用的类型已经足够了,至于其他的在继续研究中,如果错误的地方也请您指出,谢谢啦。
jernymy 20110508
jernymy@163.com
- C/C++ code
- # Android.mk by jernymy, 20110508LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := jernymyjniLOCAL_SRC_FILES := com_jni_jernymyjni.cinclude $(BUILD_SHARED_LIBRARY)
在VMware的ubuntu9.04下编译, NDK r4b的路径在../bld/android-ndk-r4-crystax,使用该ndkbuild
root@jernymy-desktop:/mnt/hgfs/workspace/AndroidJni# ../bld/android-ndk-r4-crystax/ndk-build
Compile thumb : jernymyjni <= /mnt/hgfs/workspace/AndroidJni/jni/com_jni_jernymyjni.c
SharedLibrary : libjernymyjni.so
Install : libjernymyjni.so => /mnt/hgfs/workspace/AndroidJni/libs/armeabi
root@jernymy-desktop:/mnt/hgfs/workspace/AndroidJni#
接下来编写我们的java的测试代码AndroidJni.java,目前为了方便调试,暂且用System.out输出,
可以通过android在界面上摆放一些button,然后把信息显示到button上,就可以看到效果了
现在可以先通过调试的方式,查看debug的信息。
- Java code
package com.jni; import android.app.Activity; import android.os.Bundle; public class AndroidJni extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); System.out.println("hello"); jernymyjni cJni = new jernymyjni(); System.out.println("--------jernymy test jernymyjni start--------"); System.out.println("--------display base type test"); System.out.println("--------GetChar('A')--------"); char chTmp = cJni.GetChar('A'); System.out.println(String.valueOf(chTmp)); System.out.println("***************************"); System.out.println("--------SetChar('A')--------"); int nRtn = cJni.SetChar('A'); System.out.println("nRtn:" + String.valueOf(nRtn)); System.out.println("***************************"); System.out.println("--------GetInt(5, 10)--------"); int nSum = cJni.GetInt(5, 10); System.out.println(String.valueOf(nSum)); System.out.println("***************************"); System.out.println("--------SetInt(10)--------"); nRtn = cJni.SetInt(10); System.out.println("nRtn:" + String.valueOf(nRtn)); System.out.println("***************************"); System.out.println("--------GetStr(\"Jernymy Jni GetStr\")--------"); String sStr = cJni.GetStr(); System.out.println(sStr); System.out.println("***************************"); System.out.println("--------GetStr(\"Jernymy Jni PrcsStr\")--------"); sStr = cJni.PrcsStr("Jernymy Jni TestAAA"); System.out.println(sStr); System.out.println("***************************"); System.out.println("--------SetStr(\"Jernymy Jni SetStr\")--------"); nRtn = cJni.SetStr("Java Jni Set"); System.out.println("nRtn:" + String.valueOf(nRtn)); System.out.println("***************************"); System.out.println("------------------------------------------------"); System.out.println("--------display array test"); System.out.println("--------GetCharArray('A')--------"); char[] chAry = cJni.GetCharArray('A'); int nIdx; System.out.println("chAry.length:" + String.valueOf(chAry.length)); for (nIdx = 0; nIdx < chAry.length; nIdx++) { System.out.println(String.valueOf(chAry[nIdx])+" "); } System.out.println("***************************"); System.out.println("--------SetCharArray('A')--------"); nRtn = cJni.SetCharArray(chAry); System.out.println("nRtn:" + String.valueOf(nRtn)); System.out.println("***************************"); System.out.println("--------GetIntArray({1, 2, 3}, {4, 5, 6})--------"); int[] nAddAry1 = {1, 2, 3}; int[] nAddAry2 = {4, 5, 6}; int[] nSumAry = cJni.GetIntArray(nAddAry1, nAddAry2); System.out.println("nSumAry.length:" + String.valueOf(nSumAry.length)); for (nIdx = 0; nIdx < nSumAry.length; nIdx++) { System.out.println(String.valueOf(nSumAry[nIdx])+" "); } System.out.println("***************************"); System.out.println("--------SetIntArray({1, 2, 3}--------"); nRtn = cJni.SetIntArray(nAddAry1); System.out.println("nRtn:" + String.valueOf(nRtn)); System.out.println("***************************"); System.out.println("--------GetStrArray(" + "\"Jernymy Java Jni GetStrArray\")--------"); String[] sStrAry = cJni.GetStrArray(); System.out.println("sStrAry.length:" + String.valueOf(sStrAry.length)); for (nIdx = 0; nIdx < sStrAry.length; nIdx++) { System.out.println(sStrAry[nIdx]+" "); } System.out.println("***************************"); System.out.println("--------PrcsStrArray(" + "\"Jernymy Java Jni PrcsStrArray\")--------"); sStrAry = cJni.PrcsStrArray("Jernymy Android JniTest"); System.out.println("sStrAry.length:" + String.valueOf(sStrAry.length)); for (nIdx = 0; nIdx < sStrAry.length; nIdx++) { System.out.println(sStrAry[nIdx]+" "); } System.out.println("***************************"); System.out.println("--------SetStrArray({\"Jernymy\"," + " \"Java\", \"Jni\", \"SetStrArray\"})--------"); String[] sStrSetAry = {"Jernymy", "Java", "Jni", "SetStrArray"}; nRtn = cJni.SetStrArray(sStrSetAry); System.out.println("nRtn:" + String.valueOf(nRtn)); System.out.println("***************************"); System.out.println("-------------------------------------------------"); System.out.println("--------display class test"); System.out.println("--------GetClass(0)--------"); jernymyjni cComn = cJni.GetClass(0); if (null == cComn) { System.out.println("cComn is null"); } else { System.out.println( "chChar:" + String.valueOf(cComn.chChar) +" nPuId:" + String.valueOf(cComn.nInt) +" sName:" + cComn.sString); } System.out.println("***************************"); System.out.println("--------SetClass({'N', 508, \"Native\"})--------"); jernymyjni cComnSet = new jernymyjni(); cComnSet.chChar = 'N'; cComnSet.nInt = 508; cComnSet.sString = "Native"; nRtn = cJni.SetClass(cComnSet); System.out.println("nRtn:" + String.valueOf(nRtn)); System.out.println("***************************"); System.out.println("--------GetClassArray()--------"); jernymyjni[] sStructAry = cJni.GetClassArray(); System.out.println("sStructAry:" + String.valueOf(sStructAry.length)); for (nIdx = 0; nIdx < sStructAry.length; nIdx++) { System.out.println("----index[" + String.valueOf(nIdx) + "]----"); if (null == sStructAry[nIdx]) { System.out.println("sStructAry is null"); } else { System.out.println("" +" chChar: " + String.valueOf(sStructAry[nIdx].chChar) +", nInt: " + String.valueOf(sStructAry[nIdx].nInt) +", sName: " + sStructAry[nIdx].sString); } } System.out.println("***************************"); System.out.println("--------SetClassArray(Ncomn[])--------"); System.out.println("sStructAry:" + String.valueOf(sStructAry.length)); for (nIdx = 0; nIdx < sStructAry.length; nIdx++) { System.out.println("index[" + String.valueOf(nIdx) +"] chChar:" + String.valueOf(sStructAry[nIdx].chChar) +" nInt:" + String.valueOf(sStructAry[nIdx].nInt) +" sString:" + sStructAry[nIdx].sString); } nRtn = cJni.SetClassArray(sStructAry); System.out.println("nRtn:" + String.valueOf(nRtn)); System.out.println("***************************"); System.out.println("--------Jernymy test jernymyjni end --------"); } }
好了,基本差不多了,因为俺暂时使用的类型已经足够了,至于其他的在继续研究中,如果错误的地方也请您指出,谢谢啦。
jernymy 20110508
jernymy@163.com
- 对我有用[0]
- 丢个板砖[0]
- 引用
- 举报
- 管理
- TOP
- jnet007
- (学习)
- 等 级:
#11楼 得分:0回复于:2011-05-09 13:57:02
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_cyan_jni_JniTest */
#ifndef _Included_com_cyan_jni_JniTest
#define _Included_com_cyan_jni_JniTest
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_cyan_jni_JniTest
* Method: display
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_cyan_jni_JniTest_display
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
~
~
LZ,我有这个文件com_cyan_jni_JniTest.h
但怎么没有这个c文件呀。。。
com_jni_jernymyjni.c
#include <jni.h>
/* Header for class com_cyan_jni_JniTest */
#ifndef _Included_com_cyan_jni_JniTest
#define _Included_com_cyan_jni_JniTest
#ifdef __cplusplus
extern "C" {
#endif
/*
* Class: com_cyan_jni_JniTest
* Method: display
* Signature: ()V
*/
JNIEXPORT void JNICALL Java_com_cyan_jni_JniTest_display
(JNIEnv *, jobject);
#ifdef __cplusplus
}
#endif
#endif
~
~
LZ,我有这个文件com_cyan_jni_JniTest.h
但怎么没有这个c文件呀。。。
com_jni_jernymyjni.c
- 对我有用[0]
- 丢个板砖[0]
- 引用
- 举报
- 管理
- TOP
- jernymy
- (俺们那个都是东北人)
- 等 级:
#12楼 得分:0回复于:2011-05-09 14:09:36
您好:此处可以直接编写一个om_cyan_jni_JniTest.c
然后参照上边讲述的方法即可
- 对我有用[0]
- 丢个板砖[0]
- 引用
- 举报
- 管理
- TOP
- jnet007
- (学习)
- 等 级:
#13楼 得分:10回复于:2011-05-09 14:14:17
谢谢LZ了,可以说下qq吗?小第刚接触jni不太懂。。指点下怎么用jni调用openssl?
- 对我有用[0]
- 丢个板砖[0]
- 引用
- 举报
- 管理
- TOP
- xdping520
- (xdping520)
- 等 级:
#14楼 得分:0回复于:2011-07-01 11:33:45
您好,刚接触JNI,能介绍一下android是如何调用动态库吗,如果像LZ这样生成的APK,放到手机或者开发板上执行,是不是也要把.so拷过去,还要设计.so的编译路径啊。比较困惑
- 对我有用[0]
- 丢个板砖[0]
- 引用
- 举报
- 管理
- TOP
- jernymy
- (俺们那个都是东北人)
- 等 级:
#15楼 得分:0回复于:2011-07-01 23:51:33
您好:
使用基于eclipse开发环境,将编译好的so文件放到android的工程下对应的目录
例如工程AndroidJni,在工程目录下建立一个目录libs\armeabi
然后将.so文件copy到AndroidJni\libs\armeabi\
目录结构
AndroidJni
|-bin\
|-gen\
|-jni\
|-libs\armeabi\
|-res\
|-src\
|-AndroidManifest.xml
......
这样通过eclipse编译工程,调试即可生成.apk文件,
然后下载到手机或者模拟器上,运行模式或调试模式均可
- Android的jni的调用C,C++的几个应用(基本类型,数组,类(结构体))文档-源码
- Android的jni的调用C,C++的几个应用(基本类型,数组,类(结构体))
- Android NDK环境搭建及JNI开发java和C的相互调用的基本介绍
- C#调用c++Dll结构体数组指针的问题
- C#调用c++Dll结构体数组指针的问题
- C#调用c++Dll结构体数组指针的问题
- C#调用c++Dll结构体数组指针的问题
- C#调用c++Dll结构体数组指针的问题
- android JNI基本库(jsting转string和C多线程调用java方法的说明)
- 建立Android SDK下的JNI、JAVA应用完整步骤---Android JAVA调用C+
- c语言结构体数组的应用问题
- Objective-C常用的几个结构体
- C结构的应用
- 黑马程序员-C语言的几个基本数组
- Android绕过JNi 调用C语言的方法
- android调用本地C/C++代码,jni的实现
- Android调用C++OpenCV程序的方法(NDK+JNI)
- Android上,使用JNI调用C的函数,hellojni
- 使用Eclipse构建Maven的SpringMVC项目(一)
- Mate(四)——扩展
- Spring--quartz中cronExpression配置说明
- 安卓开发之常见死机问题--log分析
- js实现字符串转换成unicode
- Android的jni的调用C,C++的几个应用(基本类型,数组,类(结构体))文档-源码
- arraycopy效率比较
- MtVerify.h 头文件内容,用的时候添加到工程就行了
- Java实现Immutable Class要点
- 关于wp7中http的GetResponse抛异常的问题
- android四大组件的 基本知识
- error C2248: 'CObject::operator =' : cannot access private member declared in class 'CObject'
- 如何将Android应用程序编译至image/rom中
- 类似BeanUtils.copyProperties拷贝对象属性值的方法