jni使用基础(九)之c调用java事例demo-阿里云开发者社区

开发者社区> hudan2714> 正文

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

 


 

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
postman的基础使用
搜索进入postman官网下载客户端,或者安装谷歌浏览器postman扩展插件。
490 0
使用thrift做c++,java和python的相互调用
linux上安装thrift见 http://jinghong.iteye.com/blog/1102535 thrift做为跨语言调用的方案有高效,支持语言较多,成熟等优点;代码侵入较强是其弱点。
807 0
c++ 使用vs2010调用 win32api
以前读书时都是用vc6.0.后来学c#用vs。装系统只装了vs2010.今天用vs2010写c++程序。发现有点陌生。就总结下,免得以后忘记。   首先用vs2010选择c++语言。新建一个win32控制台程序。
827 0
智能投顾中的基础核心,华尔街老司机手把手教你搭建智能资产配置模型
在不同的模型当中有不同的实现方式。下一节课要讲的BL模型有其他的实现方式,而在今天讲的马克维兹模型当中,通过引入一个用户的风险偏好的变量,这个变量是一个非负数的实数。
1410 0
HBase运维基础——元数据逆向修复原理
鉴于上次一篇文章——“云HBase小组成功抢救某公司自建HBase集群,挽救30+T数据”的读者反馈,对HBase的逆向工程比较感兴趣,并咨询如何使用相应工具进行运维等等。总的来说,就是想更深层理解HBase运维原理,提高运维HBase生产环境的能力,应对各种常见异常现象。
6366 0
Swift基础--使用TableViewController自定义列表
<p style="margin-top:0px; margin-bottom:0px; padding-top:0px; padding-bottom:0px; font-family:Arial; font-size:14px; line-height:26px"> 首先建立一个swift项目,把storyboard的内容删掉,添加一个Navigation Controller,然后
933 0
+关注
102
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载