您的位置:首页 > 移动开发 > Android开发

基于 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的两个方法

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本文出自duicky博客,转载请注明出处http://www.cnblogs.com/luxiaofeng54/archive/2011/08/17/2142000.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  职场 移动开发 休闲