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:andro 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); } }
資源下載:https://download.csdn.net/detail/hudan2714/4328983
最後更新:2017-04-02 17:09:25