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

 


 

目录
相关文章
|
3月前
|
存储 缓存 Java
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
这篇文章详细介绍了Java中的IO流,包括字符与字节的概念、编码格式、File类的使用、IO流的分类和原理,以及通过代码示例展示了各种流的应用,如节点流、处理流、缓存流、转换流、对象流和随机访问文件流。同时,还探讨了IDEA中设置项目编码格式的方法,以及如何处理序列化和反序列化问题。
95 1
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
|
7月前
|
Java
【Java基础】输入输出流(IO流)
Java基础、输入输出流、IO流、流的概念、输入输出流的类层次结构图、使用 InputStream 和 OutputStream流类、使用 Reader 和 Writer 流类
227 2
|
4月前
|
安全 Java API
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
String常量池、String、StringBuffer、Stringbuilder有什么区别、List与Set的区别、ArrayList和LinkedList的区别、HashMap底层原理、ConcurrentHashMap、HashMap和Hashtable的区别、泛型擦除、ABA问题、IO多路复用、BIO、NIO、O、异常处理机制、反射
|
4月前
|
安全 Java API
【性能与安全的双重飞跃】JDK 22外部函数与内存API:JNI的继任者,引领Java新潮流!
【9月更文挑战第7天】JDK 22外部函数与内存API的发布,标志着Java在性能与安全性方面实现了双重飞跃。作为JNI的继任者,这一新特性不仅简化了Java与本地代码的交互过程,还提升了程序的性能和安全性。我们有理由相信,在外部函数与内存API的引领下,Java将开启一个全新的编程时代,为开发者们带来更加高效、更加安全的编程体验。让我们共同期待Java在未来的辉煌成就!
86 11
|
4月前
|
安全 Java API
【本地与Java无缝对接】JDK 22外部函数和内存API:JNI终结者,性能与安全双提升!
【9月更文挑战第6天】JDK 22的外部函数和内存API无疑是Java编程语言发展史上的一个重要里程碑。它不仅解决了JNI的诸多局限和挑战,还为Java与本地代码的互操作提供了更加高效、安全和简洁的解决方案。随着FFM API的逐渐成熟和完善,我们有理由相信,Java将在更多领域展现出其强大的生命力和竞争力。让我们共同期待Java编程新纪元的到来!
134 11
|
5月前
|
Java
MQTT(EMQX) - Java 调用 MQTT Demo 代码
MQTT(EMQX) - Java 调用 MQTT Demo 代码
209 0
MQTT(EMQX) - Java 调用 MQTT Demo 代码
|
5月前
|
开发框架 Java Android开发
JNI中调用Java函数
JNI中调用Java函数
37 0
|
5月前
|
开发框架 Java Android开发
JNI中调用Java函数
JNI中调用Java函数
40 0
|
5月前
|
算法 Java Linux
Intellij Java JNI 调用 C++
Intellij Java JNI 调用 C++
44 0
|
7月前
|
安全 Java