Android的jni的调用C,C++的几个应用(基本类型,数组,类(结构体))文档-源码

jernymy 2011-05-09 12:54:34
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内容如下

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


...全文
1174 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
jernymy 2011-07-01
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 xdping520 的回复:]
您好,刚接触JNI,能介绍一下android是如何调用动态库吗,如果像LZ这样生成的APK,放到手机或者开发板上执行,是不是也要把.so拷过去,还要设计.so的编译路径啊。比较困惑
[/Quote]

您好:
使用基于eclipse开发环境,将编译好的so文件放到android的工程下对应的目录
例如工程AndroidJni,在工程目录下建立一个目录libs\armeabi
然后将.so文件copy到AndroidJni\libs\armeabi\

目录结构
AndroidJni
|-bin\
|-gen\
|-jni\
|-libs\armeabi\
|-res\
|-src\
|-AndroidManifest.xml
......

这样通过eclipse编译工程,调试即可生成.apk文件,
然后下载到手机或者模拟器上,运行模式或调试模式均可
xdping520 2011-07-01
  • 打赏
  • 举报
回复
您好,刚接触JNI,能介绍一下android是如何调用动态库吗,如果像LZ这样生成的APK,放到手机或者开发板上执行,是不是也要把.so拷过去,还要设计.so的编译路径啊。比较困惑
jernymy 2011-05-09
  • 打赏
  • 举报
回复



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

jernymy 2011-05-09
  • 打赏
  • 举报
回复

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

jernymy 2011-05-09
  • 打赏
  • 举报
回复


通过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的文件内容

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


jernymy 2011-05-09
  • 打赏
  • 举报
回复
编写Android.mk,内容如下

# Android.mk by jernymy, 20110508

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := jernymyjni
LOCAL_SRC_FILES := com_jni_jernymyjni.c

include $(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的信息。


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
jnet007 2011-05-09
  • 打赏
  • 举报
回复
static
{
System.loadLibrary("jernymyjni"); // jernymy here is the so name
}
LZ还在吗?,我想问下这个jernymyjni你是怎么生成的(是用c c++生成的吗?),要放在哪里?
还有如果是linux系统那么放在哪里才能加载呀。。。。??????
DrSmart 2011-05-09
  • 打赏
  • 举报
回复
晕,你用google英文搜索下就行了, 教程很多的,
jnet007 2011-05-09
  • 打赏
  • 举报
回复
谢谢LZ了,可以说下qq吗?小第刚接触jni不太懂。。指点下怎么用jni调用openssl?
jernymy 2011-05-09
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 jnet007 的回复:]
/* 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
……
[/Quote]

您好:此处可以直接编写一个om_cyan_jni_JniTest.c
然后参照上边讲述的方法即可
jnet007 2011-05-09
  • 打赏
  • 举报
回复
/* 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

80,337

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧