Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> Android Ndk中C與JAVA之間的互相調用

Android Ndk中C與JAVA之間的互相調用

編輯:關於android開發

Android Ndk中C與JAVA之間的互相調用


本例實現一個簡單的場景:

1、使用C編寫一個方法,接收1個參數,方法中調用Java的方法。

2、Java類中編寫一個方法,接收一個參數。

3、模擬調用場景:點擊按鈕 -> 調用C方法 -> C調用Java方法 -> 獲得返回值 -> Toast提示。

 

項目結構圖:

/

 

代碼如下:

CcallJava.java

 


package com.shanhy.example.ccalljava;

/**
 * C調用Java的方法
 *
 * @author SHANHY([email protected])
 * @date   2015年11月20日
 */
public class CcallJava {

	public String testCall(String str){
		return 大家好! + str;
	}
}


 

MainActivity.java

 

package com.shanhy.example.ccalljava;

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

/**
 * 加密 NDK 開發
 *
 * @author SHANHY([email protected])
 * @date 2015年11月19日
 */
public class MainActivity extends Activity {

	// 也就是你mk配置文件中的 LOCAL_MODULE
	private static final String libSoName = shanhyNdk;

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
	}

	/**
	 * 綁定給布局文件的onClick方法
	 * 
	 * @param v
	 * @author SHANHY
	 * @date   2015年11月20日
	 */
	public void testCcallJava(View v) {
		LogUtils.toastMessage(MainActivity.this, stringFromJNI(我叫返回值,我被C調用了 ^_^));
	}

	/**
	 * 聲明本地方法
	 * 
	 * 該方法為native方法.由C實現
	 * 
	 * @return JNI 給出的信息
	 */
	public native String stringFromJNI(String strText);

	/**
	 * 載入JNI生成的so庫文件
	 */
	static {
		System.loadLibrary(libSoName);
	}

}


 

Android.mk

 

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE    := shanhyNdk
LOCAL_SRC_FILES := shanhyNdk.cpp myJNI.h

include $(BUILD_SHARED_LIBRARY)


 

myJNI.h

 

#include 

#ifndef _Included_com_shanhy_example_MainActivity
#define _Included_com_shanhy_example_MainActivity
#ifdef __cplusplus
extern C {
#endif

JNIEXPORT jstring JNICALL Java_com_shanhy_example_ccalljava_MainActivity_stringFromJNI(JNIEnv *, jobject, jstring strText);

#ifdef __cplusplus
}
#endif
#endif


 

shanhyNdk.cpp

 

#include myJNI.h

jobject getInstance(JNIEnv* env, jclass obj_class){
    jmethodID construction_id = env->GetMethodID(obj_class, , ()V);
    jobject obj = env->NewObject(obj_class, construction_id);
    return obj;
}

JNIEXPORT jstring JNICALL Java_com_shanhy_example_ccalljava_MainActivity_stringFromJNI(JNIEnv* env, jobject thiz, jstring strText){
   jstring str;
   jclass java_class = env->FindClass(com/shanhy/example/ccalljava/CcallJava);
    if (java_class == 0){
       return env->NewStringUTF(not find class!);
    }
   jobject java_obj = getInstance(env, java_class);
   if (java_obj == 0){
       return env->NewStringUTF(not find java OBJ!);
   }
   jmethodID java_method = env->GetMethodID(java_class, testCall, (Ljava/lang/String;)Ljava/lang/String;);
   if(java_method == 0){
       return env->NewStringUTF(not find java method!);
   }
   str = (jstring)env->CallObjectMethod(java_obj, java_method, strText);

   return str;
}
 

 

 

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved