基于 Android NDK 的学习之旅----- C调用Java
2011-08-31 16:24
525 查看
平台上使用,一些接口,实现。
通过JNI1、
b)一个非静态的方法
中新建Provider.c
该文件中需要把Java中
把TestProviderc)对象
调用两个方法
上层4、层
层调用Java、界面设计如下:
[align=center]
[/align]
不过实用,有需要的兄弟直接到文章结束部分下载。
关键代码说明
C[/b]类[/b]
TestProvider
=(*jniEnv)->FindClass(jniEnv,"com/duicky/TestProvider");
C[/b]静态:
getTime=(*jniEnv)->GetStaticMethodID(jniEnv,
TestProvider,"getTime","()Ljava/lang/String;");
的[/b]非静态:
(*jniEnv)->CallVoidMethod(jniEnv,
mTestProvider,sayHello,jstrMSG);
。
静态
表示等等。(调用静态方法的时候Call详细调用方法,这个很重要Java的两个方法
文件不说了,嘎嘎,简介
文件夹下文件
Provider.h[/b]
Provider.c[/b]
CToJava.c[/b]
[title3]3“C成功调用了Java通过C、点击非静态方法”按钮
C并成功接收到C、C映射java故事情节还没发展这么快,GetStaticMethodID,GetMethodID
CallStaticObjectMethod,CallVoidMethod
有不理解的兄弟请留言,个人技术有限,有讲错的地方请大牛们指出,调用Java本文出自duicky博客,转载请注明出处http://www.cnblogs.com/luxiaofeng54/archive/2011/08/17/2142000.html
通过JNI1、
b)一个非静态的方法
中新建Provider.c
该文件中需要把Java中
把TestProviderc)对象
调用两个方法
上层4、层
层调用Java、界面设计如下:
[align=center]
[/align]
不过实用,有需要的兄弟直接到文章结束部分下载。
关键代码说明
C[/b]类[/b]
TestProvider
=(*jniEnv)->FindClass(jniEnv,"com/duicky/TestProvider");
C[/b]静态:
getTime=(*jniEnv)->GetStaticMethodID(jniEnv,
TestProvider,"getTime","()Ljava/lang/String;");
的[/b]非静态:
(*jniEnv)->CallVoidMethod(jniEnv,
mTestProvider,sayHello,jstrMSG);
。
静态
表示等等。(调用静态方法的时候Call详细调用方法,这个很重要Java的两个方法
package com.duicky; |
/** |
* |
* |
*@authorluxiaofeng<454162034@qq.com> |
* |
*/ |
public class TestProvider{ |
public static StringgetTime(){ |
LogUtils.printWithSystemOut( "CallFromCJavaStaticMethod" ); |
LogUtils.toastMessage(MainActivity.mContext, "CallFromCJavaStaticMethod" ); |
return String.valueOf(System.currentTimeMillis()); |
} |
public void sayHello(Stringmsg){ |
LogUtils.printWithSystemOut( "CallFromCJavaNotStaticMethod:" +msg); |
LogUtils.toastMessage(MainActivity.mContext, "CallFromCJavaNotStaticMethod:" +msg); |
} |
} |
文件不说了,嘎嘎,简介
文件夹下文件
Provider.h[/b]
#include<string.h> |
#include<jni.h> |
void GetTime(); |
void SayHello(); |
Provider.c[/b]
#include"Provider.h" |
#include<android/log.h> |
extern JNIEnv*jniEnv; |
jclassTestProvider; |
jobjectmTestProvider; |
jmethodIDgetTime; |
jmethodIDsayHello; |
int GetProviderInstance(jclassobj_class); |
/** |
*初始化类、对象、方法 |
*/ |
int InitProvider(){ |
__android_log_print(ANDROID_LOG_INFO, "JNIMsg" , "InitProviderBegin1" ); |
if (jniEnv==NULL){ |
return 0; |
} |
if (TestProvider==NULL){ |
TestProvider=(*jniEnv)->FindClass(jniEnv, "com/duicky/TestProvider" ); |
if (TestProvider==NULL){ |
return -1; |
} |
__android_log_print(ANDROID_LOG_INFO, "JNIMsg" , "InitProviderBegin2ok" ); |
} |
if (mTestProvider==NULL){ |
if (GetProviderInstance(TestProvider)!=1){ |
(*jniEnv)->DeleteLocalRef(jniEnv,TestProvider); |
return -1; |
} |
__android_log_print(ANDROID_LOG_INFO, "JNIMsg" , "InitProviderBegin3ok" ); |
} |
if (getTime==NULL){ |
getTime=(*jniEnv)->GetStaticMethodID(jniEnv,TestProvider, "getTime" , "()Ljava/lang/String;" ); |
if (getTime==NULL){ |
(*jniEnv)->DeleteLocalRef(jniEnv,TestProvider); |
(*jniEnv)->DeleteLocalRef(jniEnv,mTestProvider); |
return -2; |
} |
__android_log_print(ANDROID_LOG_INFO, "JNIMsg" , "InitProviderBegin4ok" ); |
} |
if (sayHello==NULL){ |
sayHello=(*jniEnv)->GetMethodID(jniEnv,TestProvider, "sayHello" , "(Ljava/lang/String;)V" ); |
if (sayHello==NULL){ |
(*jniEnv)->DeleteLocalRef(jniEnv,TestProvider); |
(*jniEnv)->DeleteLocalRef(jniEnv,mTestProvider); |
(*jniEnv)->DeleteLocalRef(jniEnv,getTime); |
return -3; |
} |
__android_log_print(ANDROID_LOG_INFO, "JNIMsg" , "InitProviderBegin5ok" ); |
} |
__android_log_print(ANDROID_LOG_INFO, "JNIMsg" , "InitProviderBegin6" ); |
return 1; |
} |
int GetProviderInstance(jclassobj_class){ |
if (obj_class==NULL){ |
return 0; |
} |
jmethodIDconstruction_id=(*jniEnv)->GetMethodID(jniEnv,obj_class, |
"<init>" , "()V" ); |
if (construction_id==0){ |
return -1; |
} |
mTestProvider=(*jniEnv)->NewObject(jniEnv,obj_class, |
construction_id); |
if (mTestProvider==NULL){ |
return -2; |
} |
return 1; |
} |
/** |
*获取时间----调用Java方法 |
*/ |
void GetTime(){ |
if (TestProvider==NULL||getTime==NULL){ |
int result=InitProvider(); |
if (result!=1){ |
return ; |
} |
} |
jstringjstr=NULL; |
char *cstr=NULL; |
__android_log_print(ANDROID_LOG_INFO, "JNIMsg" , "GetTimeBegin" ); |
jstr=(*jniEnv)->CallStaticObjectMethod(jniEnv,TestProvider,getTime); |
cstr=( char *)(*jniEnv)->GetStringUTFChars(jniEnv,jstr,0); |
__android_log_print(ANDROID_LOG_INFO, "JNIMsg" , "SuccessGetTimefromJava,Value=%s" ,cstr); |
__android_log_print(ANDROID_LOG_INFO, "JNIMsg" , "GetTimeEnd" ); |
(*jniEnv)->ReleaseStringUTFChars(jniEnv,jstr,cstr); |
(*jniEnv)->DeleteLocalRef(jniEnv,jstr); |
} |
/** |
*SayHello----调用Java方法 |
*/ |
void SayHello(){ |
if (TestProvider==NULL||mTestProvider==NULL||sayHello==NULL){ |
int result=InitProvider(); |
if (result!=1){ |
return ; |
} |
} |
jstringjstrMSG=NULL; |
jstrMSG=(*jniEnv)->NewStringUTF(jniEnv, "Hi,I'mFromC" ); |
__android_log_print(ANDROID_LOG_INFO, "JNIMsg" , "SayHelloBegin" ); |
(*jniEnv)->CallVoidMethod(jniEnv,mTestProvider,sayHello,jstrMSG); |
__android_log_print(ANDROID_LOG_INFO, "JNIMsg" , "SayHelloEnd" ); |
(*jniEnv)->DeleteLocalRef(jniEnv,jstrMSG); |
} |
CToJava.c[/b]
#include<string.h> |
#include<android/log.h> |
#include<jni.h> |
#include"Provider.h" |
JNIEnv*jniEnv; |
/** |
*Java中声明的nativegetTime方法的实现 |
*/ |
void Java_com_duicky_MainActivity_getTime(JNIEnv*env,jobjectthiz) |
{ |
if (jniEnv==NULL){ |
jniEnv=env; |
} |
GetTime(); |
} |
/** |
*Java中声明的nativesayHello方法的实现 |
*/ |
void Java_com_duicky_MainActivity_sayHello(JNIEnv*env,jobjectthiz) |
{ |
if (jniEnv==NULL){ |
jniEnv=env; |
} |
SayHello(); |
} |
[title3]3“C成功调用了Java通过C、点击非静态方法”按钮
C并成功接收到C、C映射java故事情节还没发展这么快,GetStaticMethodID,GetMethodID
CallStaticObjectMethod,CallVoidMethod
有不理解的兄弟请留言,个人技术有限,有讲错的地方请大牛们指出,调用Java本文出自
相关文章推荐
- 基于 Android NDK 的学习之旅-----Java 调用C
- 基于 Android NDK 的学习之旅----- C调用Java
- 基于 Android NDK 的学习之旅----- C调用Java(附源码)
- 基于 Android NDK 的学习之旅----- C调用Java
- 基于 Android NDK 的学习之旅-----Java 调用C
- 基于 Android NDK 的学习之旅----- C调用Java
- 基于 Android NDK 的学习之旅-----Java 调用C
- 基于 Android NDK 的学习之旅----- C调用Java
- 基于 Android NDK 的学习之旅-----Java 调用C
- 基于 Android NDK 的学习之旅----- C调用Java
- 基于 Android NDK 的学习之旅-----Java 调用C
- 基于 Android NDK 的学习之旅-----Java 调用C(附源码)
- 基于 Android NDK 的学习之旅----- C调用Java
- 基于 Android NDK 的学习之旅----- C调用Java
- 基于 Android NDK 的学习之旅----- C调用Java
- 基于 Android NDK 的学习之旅----- C调用Java(附源码)
- 基于 Android NDK 的学习之旅-----Java 调用 C(附源码)
- 基于 Android NDK 的学习之旅----- C调用Java(附源码)
- 基于 Android NDK 的学习之旅----- C调用Java
- 基于 Android NDK 的学习之旅-----Java 调用C(附源码)