jni使用基础(九)之c调用java事例demo

 

 

 

1.Activity

package com.devchina.ndk4;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;

public class DevchinaActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }

    public void click(View view){
    	DevchinaProvider devchina = new DevchinaProvider();
    	devchina.cCallJava();
    }

    public void clickAdd(View view){
    	DevchinaProvider devchina = new DevchinaProvider();
    	devchina.cCallAdd();
    }

    public void clickStrng(View view){
    	DevchinaProvider devchina = new DevchinaProvider();
    	devchina.cCallString();
    }

}

 

2.native

package com.devchina.ndk4;

public class DevchinaProvider {
	static  {
		System.loadLibrary("devchina");
	}

	public native void cCallJava();
	public native void cCallString();
	public native int  cCallAdd();

	//1.调用java空方法
	public void callJava(){
		System.out.println("i come from java");
	}

	public int add(int x,int y){
		System.out.println("devchina java res = "+(x+y));
		return x+y;
	}

	public void printString(String s){
		System.out.println("devchina java "+ s);
	}
}

 

3.h文件

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

#ifndef _Included_com_devchina_ndk4_DevchinaProvider
#define _Included_com_devchina_ndk4_DevchinaProvider
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     com_devchina_ndk4_DevchinaProvider
 * Method:    cCallJava
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_com_devchina_ndk4_DevchinaProvider_cCallJava
  (JNIEnv *, jobject);

/*
 * Class:     com_devchina_ndk4_DevchinaProvider
 * Method:    cCallAdd
 * Signature: ()I
 */
JNIEXPORT jint JNICALL Java_com_devchina_ndk4_DevchinaProvider_cCallAdd
  (JNIEnv *, jobject);

/*
 * Class:     com_devchina_ndk4_DevchinaProvider
 * Method:    cCallString
 * Signature: ()V
 */
JNIEXPORT void JNICALL Java_com_devchina_ndk4_DevchinaProvider_cCallString
  (JNIEnv *, jobject);

#ifdef __cplusplus
}
#endif
#endif

 

4.c文件

#include<stdio.h>
#include<jni.h>
#include"com_devchina_ndk4_DevchinaProvider.h"
#include <android/log.h>
#define LOG_TAG "devchina"
#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)

JNIEXPORT void JNICALL Java_com_devchina_ndk4_DevchinaProvider_cCallJava
  (JNIEnv * env, jobject obj){//ojb,谁调用了此Native方法,这个Obj就是谁
	//new 出java对象
	jclass clazz = (*env)->FindClass(env,"com/devchina/ndk4/DevchinaProvider");//注意:不能为“.”
	if(clazz==0){//没有找到类
		LOGI("can't find devchina class");
	}else{
		LOGI("find dechina class");
	}

	//获取类中的方法
	jmethodID j_method = (*env)->GetMethodID(env,clazz,"callJava","()V");//最后一个参数是表示方法的签名
	if(j_method==0){
		LOGI("can't get method");
	}else{
		LOGI("get method");
	}

	(*env)->CallVoidMethod(env,obj,j_method);//第二个参数表示调用的类对象
}

JNIEXPORT jint JNICALL Java_com_devchina_ndk4_DevchinaProvider_cCallAdd
  (JNIEnv * env, jobject obj){
	//1.new java obj
	jclass clazz = (*env)->FindClass(env,"com/devchina/ndk4/DevchinaProvider");
    //2.get method id
	jmethodID mId = (*env)->GetMethodID(env,clazz,"add","(II)I");
	//3.invoke method
	jint res = (*env)->CallIntMethod(env,obj,mId,5,6);
	LOGI("c log %d",res);

}

JNIEXPORT void JNICALL Java_com_devchina_ndk4_DevchinaProvider_cCallString
  (JNIEnv * env, jobject obj){
	jclass clazz = (*env)->FindClass(env,"com/devchina/ndk4/DevchinaProvider");
	jmethodID mId = (*env)->GetMethodID(env,clazz,"printString","(Ljava/lang/String;)V");
	(*env)->CallVoidMethod(env,obj,mId,(*env)->NewStringUTF(env," devchina from c "));
}

 

 

5.mk文件

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS) 

LOCAL_MODULE    :=devchina
LOCAL_SRC_FILES :=devchina.c

LOCAL_LDLIBS += -llog

include $(BUILD_SHARED_LIBRARY)

 

6.xml文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="调用c代码"
        android:onClick="click" />

      <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="调用c代码,加法"
        android:onClick="clickAdd" />

        <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="调用c代码,打印String"
        android:onClick="clickStrng" />

</LinearLayout>

 

package com.devchina.ndk4;

public class DevchinaProvider {
	static  {
		System.loadLibrary("devchina");
	}

	public native void cCallJava();
	public native void cCallString();
	public native int  cCallAdd();

	//1.调用java空方法
	public void callJava(){
		System.out.println("i come from java");
	}

	public int add(int x,int y){
		System.out.println("devchina java res = "+(x+y));
		return x+y;
	}

	public void printString(String s){
		System.out.println("devchina java "+ s);
	}
}

资源下载:http://download.csdn.net/detail/hudan2714/4328983

 

 

时间: 2024-12-03 13:18:03

jni使用基础(九)之c调用java事例demo的相关文章

jni使用基础(七)之java调用c事例Demo

    1.界面: package com.devchina.ndk3; import android.app.Activity; import android.os.Bundle; import android.view.View; import android.widget.Toast; public class DemoActivity extends Activity { static{ System.loadLibrary("devchina"); } @Override p

jni使用基础(八)之jni使用流程及C调用java简单说明

  jni使用步骤: 1.定义好native接口. 2.使用javah工具,生成头文件. 3.根据头文件,创建c文件. 4.编写Android.mk文件. 5.通过cygwin,进入到该工程目录,通过ndk-buld命令,编译c文件,生成so库文件 6.即可完成调用     怎样在c中调用java? 也就是要在c代码中,new出java对象,然后再调用java对象中的方法即可. 要创建java对象,就要找到java类,相当于找到类的class文件,使用jni中的 FindClass去找到相应的类

jni调用java方法报错!!!

问题描述 jni调用java方法报错!!! 12-04 11:33:08.818: A/art(23825): art/runtime/check_jni.cc:70] JNI DETECTED ERROR IN APPLICATION: calling static method java.lang.String com.library.utils.MD5Utils.md5(java.lang.String) with CallObjectMethod 12-04 11:33:08.818:

为什么C++通过JNI调用JAVA类函数速度慢近十倍?

问题描述 很不解,多谢了.实在对不住,积分所剩不多. 问题补充:兄台误会我意思了,主要我没说清楚.我是指Java类中的某个函数的执行时间在C++中通过JNI方式调用执行要比通过Java传统方式执行要慢很多.wkfighting 写道 解决方案 建议你在论坛问问他RednaxelaFX解决方案二:将java类中的方法执行两次,估计第二次时间就正常了.我猜测是Java类的延迟装载造成第一次调用慢了,你可以试试看,不知道我猜测的对不对?解决方案三:你是什么样的代码呢?能再说具体一点吗?JVM本身也有优

Android JNI c/c++调用java的实例

Android JNI c/c++调用java的实例 近期通过研究SDL源码 得出Android JNI  c/c++调用Java 无需新建虚拟机,这样省去很多步骤,这样调用Android JNI会变得非常容易,大家看下简单实例: 具体步骤如下 第一步获得:两个参数 JNIEnv和jclass void Java_com_Test_Audio_Init( JNIEnv* env,jclass cls, jobject thiz ) { InitJNI(env,cls); } bool InitJ

两种php调用Java对象的方法_php基础

1.php的Java模块  php发布版中包含一个Java扩展模块,可以用来调用Java对象,例如:  <?php  $system=new Java("java.lang.System");  print "Java version=".$system->getProperty("java.version")."  ";  ?>  2.minij2ee应用服务器SJOP协议实现  minij2ee应用服务器

C#调用Java方法(详细实例)

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

JNI编程基础(一)

JNI-Java Native Interface,是Java平台提供的一个特性,通过编写JNI函数实现Java代码调用C/C++代码以及C/C++代码调用Java代码的作用.从而达到利用不同语言的特点.为什么需要在Java中调用C/C++代码,在我看来最主要有以下三点: C/C++代码相比Java有着更高的性能 C/C++代码更难被反编译,有更好的安全性 通过JNI函数可以绕开JVM的限制,完成一些在Java层面实现不了的功能.典型的例子就是Android热修复框架AndFix 既然要实现C/

Jni使用基础(一)之简单介绍说明

  JNI(Java Native Interface,JAVA原生接口)  Jni 是一个协议,用来沟通java代码和外部的本地代码(c/c++)相互调用.   为什么要进行交互?  首先,Java语言提供的类库无法满足要求,且在数学运算,实时渲染的游戏上,音视频处理等方面上与C/C++相比效率稍低.   然后,Java语言无法直接操作硬件,C/C++代码不仅能操作硬件而且还能发挥硬件最佳性能.  接着,使用Java调用本地的C/C++代码所写的库,省去了重复开发的麻烦,并且可以利用很多开源的