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.24. 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.bz25. 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.zip6. 二、配置好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内容如下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的所有接口处,作为测试设计了基本类型,数组,和类(结构体),结构体数组等。
代码如下
package com.jni;// jernymy use c style for var name
public 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                        : jernymy
 * @date                          : 20110508
 * */
public native int      SetClassArray(jernymyjni[] acClassAry);
/*-------- jernymy for class(struct) array type declaration end   --------*/ static
{
System.loadLibrary("jernymyjni"); // jernymy here is the so name
}
}

解决方案 »

  1.   

    通过eclipse的生成对应的class文件,会在AndroidJni\bin下生成所有的文件然后进入windowsXP的command模式
    开始->运行->cmd
    到我们的项目的所在目录,我的目录为
    运行javah,得到对应的jni的头文件
    E:\work\jave\workspace\AndroidJni>javah -classpath bin com.jni.jernymyjniE:\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 jniE:\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的文件内容/* 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 __cplusplus
    extern "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
      

  2.   


    com_jni_jernymyjni.c的文件内容#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)upper
    JNIEXPORT 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   2
    JNIEXPORT 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    3
    JNIEXPORT 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;
    }
      

  3.   


    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;
    }
      

  4.   

    晕,你用google英文搜索下就行了, 教程很多的,
      

  5.   

    static
        {
            System.loadLibrary("jernymyjni"); // jernymy here is the so name
        }
    LZ还在吗?,我想问下这个jernymyjni你是怎么生成的(是用c c++生成的吗?),要放在哪里?
    还有如果是linux系统那么放在哪里才能加载呀。??????
      

  6.   

    编写Android.mk,内容如下# Android.mk by jernymy,  20110508LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE    := jernymyjni
    LOCAL_SRC_FILES := com_jni_jernymyjni.cinclude $(BUILD_SHARED_LIBRARY)
    在VMware的ubuntu9.04下编译, NDK r4b的路径在../bld/android-ndk-r4-crystax,使用该ndkbuildroot@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的信息。
    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
    [email protected]
      

  7.   

    /* 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
      

  8.   


    您好:此处可以直接编写一个om_cyan_jni_JniTest.c
    然后参照上边讲述的方法即可
      

  9.   

    谢谢LZ了,可以说下qq吗?小第刚接触jni不太懂。。指点下怎么用jni调用openssl?
      

  10.   

    您好,刚接触JNI,能介绍一下android是如何调用动态库吗,如果像LZ这样生成的APK,放到手机或者开发板上执行,是不是也要把.so拷过去,还要设计.so的编译路径啊。比较困惑
      

  11.   


    您好:
    使用基于eclipse开发环境,将编译好的so文件放到android的工程下对应的目录
    例如工程AndroidJni,在工程目录下建立一个目录libs\armeabi
    然后将.so文件copy到AndroidJni\libs\armeabi\目录结构
    AndroidJni
      |-bin\
      |-gen\
      |-jni\
      |-libs\armeabi\
      |-res\
      |-src\
      |-AndroidManifest.xml
      ......这样通过eclipse编译工程,调试即可生成.apk文件,
    然后下载到手机或者模拟器上,运行模式或调试模式均可