六、Android学习笔记_JNI_c调用java代码
1、编写native方法(java2c)和非native方法(c2java):
package com.example.provider;
public class CallbackJava {
// C调用java空方法
public void helloFromJava() {
System.out.println("hello from java");
}
// C调用java中的带两个int参数的方法
public int Add(int x, int y) {
int result = x + y;
System.out.println("java result=" + result);
return result;
}
// C调用java中参数为string的方法
public void printString(String s) {
System.out.println("java " + s);
}
//静态方法
public static void printStaticStr(String s) {
System.out.println("java static-> " + s);
}
// 让c代码调用对应的java代码
public native void callHelloFromJava();
public native void callAdd();
public native void callPrintString();
// 调用一个静态的c代码
public native void callPrintStaticStr();
}
2、通过javah命令生成签名,通过javap命令生产native方法签名:

3、c代码
FindClass:找到java中的类文件
GetMethodID:根据类和方法签名找到要调用的方法。
#include <stdio.h>
#include <jni.h>
#include <malloc.h>
#include "com_example_provider_CallbackJava.h";
#include "com_example_jni_MainActivity.h"; #include <android/log.h>
#define LOG_TAG "System.out.c"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__) jmethodID getMethodId(JNIEnv * env, char* methodname, char* signname) {
jclass jclazz = (*env)->FindClass(env, "com/example/provider/CallbackJava");
if (jclazz == 0) {
LOGD("class not find ");
return;
}
//2、找class中方法的id,第三个参数方法名称,第四个参数该方法对应的签名
jmethodID methodid = (*env)->GetMethodID(env, jclazz, methodname, signname);
if (methodid == 0) {
LOGD("method not find ");
return;
}
return methodid;
} JNIEXPORT void JNICALL Java_com_example_provider_CallbackJava_callHelloFromJava
(JNIEnv * env, jobject obj) {
//1、 找java中的class文件
//第二个参数是类名的(包名)
jclass jclazz = (*env)->FindClass(env,"com/example/provider/CallbackJava");
if(jclazz==0) {
LOGD("class not find ");
return;
}
//2、找class中方法的id,第三个参数方法名称,第四个参数该方法对应的签名
jmethodID methodid = (*env)->GetMethodID(env, jclazz,"helloFromJava","()V");
if(methodid==0) {
LOGD("helloFromJava method not find ");
return;
}
//3、调用方法
//void (*CallVoidMethod)(JNIEnv*, jobject, jmethodID, ...);
(*env)->CallVoidMethod(env,obj,methodid);
} JNIEXPORT void JNICALL Java_com_example_provider_CallbackJava_callAdd
(JNIEnv *env, jobject obj) {
jmethodID mid = getMethodId(env,"Add","(II)I");
int result = (*env)->CallIntMethod(env, obj, mid,3,6);
LOGD("c to java add: d%",result);
} JNIEXPORT void JNICALL Java_com_example_provider_CallbackJava_callPrintString
(JNIEnv *env, jobject obj) {
LOGD("c to java callPrintString start ");
jmethodID mid = getMethodId(env,"printString","(Ljava/lang/String;)V");
(*env)->CallVoidMethod(env, obj, mid,(*env)->NewStringUTF(env," call printString finish"));
LOGD("c to java callPrintString finish ");
} JNIEXPORT void JNICALL Java_com_example_provider_CallbackJava_callPrintStaticStr
(JNIEnv *env, jobject obj) {
jclass jclazz = (*env)->FindClass(env, "com/example/provider/CallbackJava");
if (jclazz == 0) {
LOGD("class not find ");
return;
}
//静态方法调用GetStaticMethodID 和 CallStaticXXXMethod
jmethodID methodid = (*env)->GetStaticMethodID(env, jclazz, "printStaticStr", "(Ljava/lang/String;)V");
if (methodid == 0) {
LOGD("printStaticStr method not find ");
return;
}
(*env)->CallStaticVoidMethod(env, jclazz, methodid,(*env)->NewStringUTF(env,"static hello java")); } JNIEXPORT void JNICALL Java_com_example_jni_MainActivity_callProvider
(JNIEnv *env, jobject obj){
jclass jclazz = (*env)->FindClass(env,"com/example/provider/CallbackJava");
if(jclazz==0) {
LOGD("class not find ");
return;
}
jmethodID methodid = (*env)->GetMethodID(env, jclazz,"helloFromJava","()V");
if(methodid==0) {
LOGD("helloFromJava method not find ");
return;
}
//创建一个CallbackJava对象
jobject jobj =(*env)->AllocObject(env, jclazz);
(*env)->CallVoidMethod(env,jobj,methodid); }
4、编译多个c文件可以用空格分开
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE :=Hello
#LOCAL_SRC_FILES :=Hello.c
LOCAL_SRC_FILES :=CallbackJava.c Hello.c
LOCAL_LDLIBS += -llog
include $(BUILD_SHARED_LIBRARY)
参考http://www.open-open.com/lib/view/open1359700820369.html
六、Android学习笔记_JNI_c调用java代码的更多相关文章
- Android学习笔记_JNI_c调用java代码
1.编写native方法(java2c)和非native方法(c2java): package com.example.provider; public class CallbackJava { // ...
- JNI学习笔记_C调用Java
一.笔记 1.C调用Java中的方法,参考jni.pdf pg97可以参考博文:http://blog.csdn.net/lhzjj/article/details/26470999步骤: a. 创建 ...
- android Webview 实现js调用java代码实现Activity跳转
今天有了一个需求,在android里webview加载的html页面,要求点击html页面的按钮实现Activity的跳转. 咱是是菜鸟,webview的接触不多,于是就和度娘来了次亲密接触.在其中也 ...
- Android学习笔记(9):使用XML文件和Java代码控制UI界面
Android推荐使用XML文件设置UI界面.然后用Java代码控制逻辑部分,这体现了MVC思想. MVC全名是Model View Controller.是模型(model)-视图(view)-控制 ...
- 【转】 Pro Android学习笔记(六九):HTTP服务(3):HTTP POST MultiPart
目录(?)[-] 建立测试环境 开发环境导入第三方JAR HTTP Post Multipart小例子 HTTP POST不仅可以通过键值对传递参数,还可以携带更为复杂的参数,例如文件.HTTP Po ...
- 【转】 Pro Android学习笔记(五六):配置变化
目录(?)[-] Activity的destorycreate过程 Fragment的destorycreate过程 onSaveInstanceState saveFragmentInstanceS ...
- 【转】 Pro Android学习笔记(七六):服务(1):local和remote
文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingflying/ Android提供服务,服务是运行在后台的 ...
- 【转】 Pro Android学习笔记(六七):HTTP服务(1):HTTP GET
目录(?)[-] HTTP GET小例子 简单小例子 出现异常NetworkOnMainThreadException 通过StrictMode进行处理 URL带键值对 Andriod应用可利用ser ...
- 【转】Pro Android学习笔记(十二):了解Intent(下)
解析Intent,寻找匹配Activity 如果给出component名字(包名.类名)是explicit intent,否则是implicit intent.对于explicit intent,关键 ...
随机推荐
- pic/at89c2051 programmer
http://dangerousprototypes.com/forum/viewtopic.php?t=170 It looks like the PICKIT2 uses a small boos ...
- C++之类型转换
说明:本文仅供学习交流,转载请标明出处,欢迎转载! 实现将A类的对象转换为B类对象的方法有3种:(A类对象<-------B类对象) 方法一:如果A为基类,B为派生类,能够将派生类的对象转 ...
- Eclipse配置PyDev插件
安装python解释器 安装PyDev: 首先需要去Eclipse官网下载:http://www.eclipse.org/,Eclipse需要JDK支持,如果Eclipse无法正常运行,请到Java官 ...
- Codeforces Round #336 (Div. 2) C. Chain Reaction set维护dp
C. Chain Reaction 题目连接: http://www.codeforces.com/contest/608/problem/C Description There are n beac ...
- Codeforces Round #313 (Div. 1) B. Equivalent Strings DFS暴力
B. Equivalent Strings Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/559 ...
- Linux中搭建SVNserver
一 下载工具 1. subversion-1.6.17.tar.gz 2. subversion-deps-1.6.17.tar.gz 二 解压两个包: 1.在此之前,我已经创建了一个用户svnroo ...
- Fitness training
2014-01-14 第一次跑步,结束后大腿酸. 2014-01-15 第二次跑步,跑的过程中臀部酸痛,结束后大腿酸痛. 已经进行跑步8次了,后6次,每次3000米 2014-02-06 plank ...
- [Angular 2] Share a Service Across Angular 2 Components and Modules
Services are used to share data between components. They follow a module pattern that allows you to ...
- iOS 原生地图(MapKit、MKMapView)轨迹渐变
WechatIMG2.png 项目已接入高德地图,并且大部分功能已经实现好,但BOSS觉得iOS自带的地图效果更好...本着面向老板编程的思想,换之.还好,高德地图是在MapKit上封装的,大部分ap ...
- 删除sqlserver2008登录记录
SQL Server Management Studio登陆窗口 清空这些多余的登陆名 删除SqlStudio.bin文件 WinXP: C:\Documents and Settings\用户文件夹 ...