c调用java

public class MainActivity extends AppCompatActivity {

    private JNI jni;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        jni = new JNI();
    }

    public void test1(View v){
        jni.callVoid();
    }
    public void test2(View v){
        jni.callInt();
    }
    public void test3(View v){
        jni.callString();
    }

    public void test4(View v){
        //jni.callShowToast();
        callShowToast();
    }

    public void showToast(String s){
        Toast.makeText(this, s, Toast.LENGTH_SHORT).show();
    }

    public native void callShowToast();
}
public class JNI {
    static {
        System.loadLibrary("ccalljava");
    }
   // C调用java空方法
    public void helloFromJava(){
        Log.e("calljava","hello from java");
    }
   // C调用java中的带两个int参数的方法
    public int add(int x,int y) {
        return x+y;
    }
   // C调用java中参数为string的方法
    public void printString(String s){
        Log.e("calljava",s);
    }

    public native void callVoid();
    public native void callInt();
    public native void callString();
    public native void callShowToast();

}

上面图片是下面代码的标题

/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class com_itheima_ccalljava_JNI */

#ifndef _Included_com_itheima_ccalljava_JNI
#define _Included_com_itheima_ccalljava_JNI
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_itheima_ccalljava_JNI
 * Method:    callVoid
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_com_itheima_ccalljava_JNI_callVoid
  (JNIEnv *, jobject);

/*
 * Class:     com_itheima_ccalljava_JNI
 * Method:    callInt
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_com_itheima_ccalljava_JNI_callInt
  (JNIEnv *, jobject);

/*
 * Class:     com_itheima_ccalljava_JNI
 * Method:    callString
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_com_itheima_ccalljava_JNI_callString
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

Android.mk文件:下面

# Copyright (C) 2009 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
#LOCAL_PATH 获取当前路径
LOCAL_PATH := $(call my-dir)
# 清除上次编译获取的编译环境变量 会保存LOCAL_PATH
include $(CLEAR_VARS)

#指定编译生成的模块叫什么名字  生成的.so名字会加上lib前缀和.so后缀
LOCAL_MODULE    := ccalljava
#指定要编译的.c源文件叫什么名字
LOCAL_SRC_FILES := ccalljava.c
LOCAL_LDLIBS += -llog

#生成动态链接库 .so文件
include $(BUILD_SHARED_LIBRARY)
#include <jni.h>
// Created by fullcircle on 2017/2/19.
//
#include <android/log.h>
#define LOG_TAG "System.out"
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)
JNIEXPORT void JNICALL Java_com_zz_ccalljava_JNI_callVoid
(JNIEnv * env, jobject thiz){
    //①找到字节码对象  Class  jclass      (*FindClass)(JNIEnv*, const char*);
    //第二个参数 要找到的字节码的全类名
    jclass clazz = (*env)->FindClass(env,"com/zz/ccalljava/JNI");
    //②在Class 中找到要调用的方法 Method
    //jmethodID   (*GetMethodID)(JNIEnv*, jclass, const char*, const char*);
    //GetMethodID 第二个参数 clazz字节码对象 第三个参数方法的名字 第四个参数 方法签名 可以通过javap -s 获取
    //在Studio中到模块的 build/intermediates/classes/debug 执行javap -s 要生成方法签名的类的全路径
    jmethodID methodID = (*env)->GetMethodID(env,clazz,"helloFromJava","()V");
    //③通过Class获取对象(有时可以省略 当native方法和要回调的java方法在同一个类中就可以使用传过来的jobject调用方法)
    //④通过对象调用方法 void        (*CallVoidMethod)(JNIEnv*, jobject, jmethodID, ...);
    (*env)->CallVoidMethod(env,thiz,methodID);
}

/*
 * Class:     com_zz_ccalljava_JNI
 * Method:    callInt
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_com_zz_ccalljava_JNI_callInt
(JNIEnv * env, jobject thiz){
    //①找到class
    jclass clazz =(*env)->FindClass(env,"com/zz/ccalljava/JNI");
    //②找到方法
    jmethodID  methodID = (*env)->GetMethodID(env,clazz,"add","(II)I");
    //③调用方法
    int result = (*env)->CallIntMethod(env,thiz,methodID,3,4);
    LOGE("result=%d",result);
}

/*
 * Class:     com_zz_ccalljava_JNI
 * Method:    callString
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_com_zz_ccalljava_JNI_callString
(JNIEnv * env, jobject thiz){
    jclass clazz = (*env)->FindClass(env,"com/zz/ccalljava/JNI");
    jmethodID methodID=(*env)->GetMethodID(env,clazz,"printString","(Ljava/lang/String;)V");
    jstring jstr = (*env)->NewStringUTF(env,"hello from c");
    (*env)->CallVoidMethod(env,thiz,methodID,jstr);
}

JNIEXPORT void JNICALL Java_com_zz_ccalljava_JNI_callShowToast
        (JNIEnv * env, jobject thiz){
    jclass clazz =(*env)->FindClass(env,"com/zz/ccalljava/MainActivity");
    jmethodID methodID = (*env)->GetMethodID(env,clazz,"showToast","(Ljava/lang/String;)V");
    //由于callShowToast这个native方法是在 jni这个类中 要调用的java方法是在MainActivity中 所以不能使用传入的jobject
    //需要创建一个对象 jobject     (*AllocObject)(JNIEnv*, jclass);
    jobject jobj =(*env)->AllocObject(env,clazz);
    jstring jstr = (*env)->NewStringUTF(env,"hello from c");
    (*env)->CallVoidMethod(env,jobj,methodID,jstr);
}

JNIEXPORT void JNICALL Java_com_zz_ccalljava_MainActivity_callShowToast
        (JNIEnv * env, jobject thiz){
    jclass clazz =(*env)->FindClass(env,"com/zz/ccalljava/MainActivity");
    jmethodID methodID = (*env)->GetMethodID(env,clazz,"showToast","(Ljava/lang/String;)V");
    //由于callShowToast这个native方法是在 jni这个类中 要调用的java方法是在MainActivity中 所以不能使用传入的jobject
    //需要创建一个对象 jobject     (*AllocObject)(JNIEnv*, jclass);
   // jobject jobj =(*env)->AllocObject(env,clazz);
    jstring jstr = (*env)->NewStringUTF(env,"hello from c");
    (*env)->CallVoidMethod(env,thiz,methodID,jstr);
}
时间: 2024-10-05 23:35:05

c调用java的相关文章

基于 Android NDK 的学习之旅----- C调用Java

http://www.cnblogs.com/luxiaofeng54/archive/2011/08/17/2142000.html 基于 Android NDK 的学习之旅----- C调用Java许多成熟的C引擎要移植到Android 平台上使用 , 一般都会 提供 一些接口, 让Android sdk 和 jdk 实现. 下文将会介绍 C 如何 通过 JNI 层调用 Java 的静态和非静态方法. 1.主要流程 1.  新建一个测试类TestProvider.java a)       

如何在android平台上使用js直接调用Java方法[转]

转载自:http://www.cocos.com/docs/html5/v3/reflection/zh.html #如何在android平台上使用js直接调用Java方法 在cocos2d-js 3.0beta中加入了一个新特性,在android平台上我们可以通过反射直接在js中调用java的静态方法.它的使用方法很简单: var o = jsb.reflection.callStaticMethod(className, methodName, methodSignature, parame

Android的WebView通过JS调用java代码

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

hessian 通信,C#客户端调用java服务端服务

Hessian是一个轻量级的remoting onhttp工具,使用简单的方法提供了RMI的功能. 相比WebService,Hessian更简单.快捷.采用的是二进制RPC协议,因为采用的是二进制协议,所以它很适合于发送二进制数据(来自百度) 本次通过hessian简单实现C#调用java服务,并返回java方法的结果,其中C#以及java方法的参数可以是Entity. 1. 依赖 java包及DLL   1.1 hessian-4.0.37.jar   1.2 Hessiancsharp.d

LuaJ 调用java方法性能研究

先简单写一下: lua调用java的方法,在luaJ中有两种. 1 使用官方提供的luaJava库 local ins = luajava.newInstance( "com.test.lj.TestClass");ins:test() 2 自己绑定方法,采用类似原版lua的方式将方法 local ins = TestClass.new() --new方法自己绑定 ins:test() 哪种方法好? 结论: 令人惊讶的是,luajava库反射调用的性能在某些情况下,竟然比java原生绑

C#调用Java方法

C#调用Java方法(详细实例) 阅读目录 C#调用c++ C#调用JAVA方法 C#可以直接引用C++的DLL和转换JAVA写好的程序.最近由于工作原因接触这方面比较多,根据实际需求,我们通过一个具体例子把一个JAVA方法转换成可以由C#直接调用的DLL 回到目录 C#调用c++ C#调用C++的例子网上很多,以一个C++的具体方法为例. C++代码 // 获取一帧图像数据 MVSMARTCAMCTRL_API int __stdcall MV_SC_GetOneFrame(IN void*

DelphiXE7如何调用Java Class,JAR等文件?

源文地址:http://jingyan.baidu.com/article/e4d08ffdb61b040fd3f60d44.html 第一步,我们先在互联网上把java2pas这个工具下载下来. 下载地址:http://download.csdn.net/detail/zqycn/7791619 下载地址:http://download.csdn.net/detail/zhujianqiangqq/8985597 第二步,打开[windows菜单]-->在运行框中输入[cmd]敲回车键. 如:

jni中调用java方法获取当前apk的签名文件md5值

相应的java方法: void getsign(Context context) throws Exception { PackageInfo localPackageInfo = context.getPackageManager() .getPackageInfo(context.getPackageName(), 64); StringBuilder localStringBuilder = new StringBuilder(); Signature[] arrayOfSignature

【cocos2d-js官方文档】二十四、如何在android平台上使用js直接调用Java方法

在cocos2d-js 3.0beta中加入了一个新特性,在android平台上我们可以通过反射直接在js中调用java的静态方法.它的使用方法很简单: var o = jsb.reflection.callStaticMethod(className, methodName, methodSignature, parameters...) 在callStaticMethod方法中,我们通过传入Java的类名,方法名,方法签名,参数就可以直接调用Java的静态方法,并且可以获得Java方法的返回

Esper调用Java代码执行系统命令

Esper语言是可以调用高级语言的静态方法的: 以调用Java的静态方法执行系统命令为例: select Runtime.getRuntime().exec(\"calc\"),avg(price) from " + product + ".win:length_batch(3) 完整代码可以参考如下链接: http://blog.csdn.net/luonanqin/article/details/9900295