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 <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"));

}

Android学习笔记_JNI_c调用java代码

时间: 2024-10-02 04:19:14

Android学习笔记_JNI_c调用java代码的相关文章

六、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 res

我的Android学习笔记(仍然JAVA)

面向对象 *是一种认为抽象的编程模型 *复杂问题分解成一个个独立的小问题,通过单独解决每个小问题,来解决复杂问题 类 *理解成"图纸" *对事物.算法.逻辑.概念的抽象 *封装(将相关的数据.代码封装成一个类组件) 对象(实例) *理解成从"图纸"创建的"产品" *每个对象占用独立的内存空间,保存自己的属性数据 *每个对象可以独立控制让他执行指定方法的代码 引用 *理解成"遥控器" *引用变量保存一个对象的内存地址 通过引用,

android学习笔记之调用拨号界面拨打电话

调用拨号界面拨打电话(不直接打出去) Intent intent1=  new Intent(Intent.ACTION_DIAL);             intent1.setData(Uri.parse("tel:400-8181800"));           startActivity(intent1); Manifest文件里:   设置权限 <uses-permission android:name="android.permission.CALL_P

Android 学习笔记--9妹图片+代码混淆+打包

一.Android Studio 创建.9文件       注:找一张背景透明的png图片,将文件名改成 " xxxx.9.png " 然后放到drawable文件中,双击  注:有一种情况是使用别人的.9文件(见下图) 注:最后编译一下,看下是否能编译成功!,只有合格的 .9图片才会编译通过. (但有些png图片不能改能 .9图片,不知道为什么?) 二.APK打包过程

Android学习笔记(十七)——使用意图调用内置应用程序

使用意图调用内置应用程序 1.创建一个新的Android项目并命名为Intents,在main.xml文件中添加两个Button: <Button android:id="@+id/btn_webbrowser" android:layout_width="fill_parent" android:layout_height="wrap_content" android:onClick="onClickWebBrowser&quo

Android的WebView通过JS调用java代码

做项目时候会遇到我们用WebView 打开一个web,希望这个web可以调用自己的一些方法,比如我们在进一个web页面,然后当我们点击web上的某个按钮时,希望能判断当前手机端是否已经登录,如果未登录,那么就会跳转到登录页面(登陆页面是另一个Activity).这个时候,一个简单的做法就是在按钮动作事件的js上调用java的方法,从而起到判断是否登录,并决定是否跳转到另一个页面. Google的WebView为我们提供了 addJavascriptInterface(Object obj, St

Android的JS调用Java代码或使用了Javascript相关技术改如何混淆

http://www.androidren.com/index.php?qa=282&qa_1=android的js调用java代码或使用了javascript相关技术改如何混淆 Android 4.2开始 JS调用Java代码的时候必须加上@JavascriptInterface才能调用. 加上@JavascriptInterface之后就必须要考虑混淆时候的问题,如果混淆的时候把@JavascriptInterface搞丢了你的程序就无法调用了. 其实很简单,你只需要在混淆里面加上: -ke

Android学习笔记(四四):第三方Java库的使用

Java有很多第三方库.Android的Dalvik虚拟器不完全是Java,也就是Android SDK和传统的SDK不完全一样,如果Java库兼容Android,则可被利用.Java库使用受限于下面因素: 目标平台:Java代码适配版本是否比Android基于的Java版本更高.是否用了Android不支持的Java SE的API,例如Swing.AWT图形. Size:为桌面或者服务器设计的Java代码不需要考虑存储和内存空间,Android需要,使用第三方Java代码,可能会是应用Size

Pro Android学习笔记(三三):Menu(4):Alternative菜单

什么是Alternative menu(替代菜单) 举个例子,Activity显示一个文本文件.如果用户想对文本文件进行编辑,Activity不提供编辑能力,但可由其他activity或者其他应用提供.我们将相关信息存储在一个intent中,例如该文本的Uri.这个intent可以匹配系统的多个应用,替代菜单将这些应用一一列出,菜单项的title就是该可被调用的activity的名字,图标也为该可被调用的activity的图表. 小例子说明 我们通过一个小例子进行学习,简单地打开一个URL:we