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 == ) {
LOGD("class not find ");
return;
}
//2、找class中方法的id,第三个参数方法名称,第四个参数该方法对应的签名
jmethodID methodid = (*env)->GetMethodID(env, jclazz, methodname, signname);
if (methodid == ) {
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==) {
LOGD("class not find ");
return;
}
//2、找class中方法的id,第三个参数方法名称,第四个参数该方法对应的签名
jmethodID methodid = (*env)->GetMethodID(env, jclazz,"helloFromJava","()V");
if(methodid==) {
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,,);
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 == ) {
LOGD("class not find ");
return;
}
//静态方法调用GetStaticMethodID 和 CallStaticXXXMethod
jmethodID methodid = (*env)->GetStaticMethodID(env, jclazz, "printStaticStr", "(Ljava/lang/String;)V");
if (methodid == ) {
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==) {
LOGD("class not find ");
return;
}
jmethodID methodid = (*env)->GetMethodID(env, jclazz,"helloFromJava","()V");
if(methodid==) {
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)-控制 ...
- Android学习笔记之JSON数据解析
转载:Android学习笔记44:JSON数据解析 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,为Web应用开发提供了一种 ...
- 【转】 Pro Android学习笔记(七八):服务(3):远程服务:AIDL文件
目录(?)[-] 在AIDL中定义服务接口 根据AIDL文件自动生成接口代码 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.n ...
- 【转】 Pro Android学习笔记(七七):服务(2):Local Service
目录(?)[-] Local service代码 调用Local ServiceLocal Service client代码 AndroidManifestxml定义Serviceacitivty的l ...
- 【转】 Pro Android学习笔记(七四):HTTP服务(8):使用后台线程AsyncTask
目录(?)[-] 5秒超时异常 AsyncTask 实现AsyncTask抽象类 对AsyncTask的调用 在哪里运行 其他重要method 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注 ...
- 【转】 Pro Android学习笔记(三三):Menu(4):Alternative菜单
目录(?)[-] 什么是Alternative menu替代菜单 小例子说明 Alternative menu代码 关于Category和规范代码写法 关于flags 多个匹配的itemId等参数 什 ...
随机推荐
- Linux 上安装 weblogic12C (静默安装) (一)
最近负责在linux上安装weblogic,客户说要安装最新的版本,版本号为 12.1.X(12.1.2,12.1.3).开始以为和旧版安装一样,使用控制台的方式,下载bin文件,然后一步步在cons ...
- 推荐文章unity框架与工具
https://www.indienova.com/u/kuaile/blogread/1343
- 数据库和AI的一次火花
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由宗文 发表于云+社区专栏 | 导语 通过历史数据,基于时间序列来预测未来. 我们生活中很多数据是有时间维度的.比如说天气或者股票价格. ...
- 白话SpringCloud | 第九章:路由网关(Zuul)的使用
前言 介绍完分布式配置中心,结合前面的文章.我们已经有了一个微服务的框架了,可以对外提供api接口服务了.但现在试想一下,在微服务框架中,每个对外服务都是独立部署的,对外的api或者服务地址都不是不尽 ...
- java使用netty的模型总结
一 由于本人的码云太多太乱了,于是决定一个一个的整合到一个springboot项目里面. 附上自己的github项目地址 https://github.com/247292980/spring-boo ...
- MarkDown 语言简单使用
# Markdown file 满足 ...
- document.write()重写问题
document.write(); 可用于重写给某个元素追加内容; 当document.write(); 用于JS文件中,会重写整个页面,解决这个问题有多种方法. 重写原因:当onload的时候执行 ...