JNI學習2:android 調用C語言方法與C語言調用android方法

來源:互聯網
上載者:User

標籤:

#include <jni.h>#include <stdio.h>#include <stdlib.h>#include <jni.h>#include <android/log.h>#define LOG_TAG "System.out"//日誌亂碼時請將專案檔編碼設定為UTF-8/**debug層級日誌:ANDROID_LOG_DEBUG:層級,LOG_TAG:標籤,__VA_ARGS__:日誌內容)**/#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG,LOG_TAG,__VA_ARGS__)/**info層級日誌:ANDROID_LOG_INFO:層級,LOG_TAG:標籤,__VA_ARGS__:日誌內容)**/#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)extern "C" {/***java語言String轉C語言char***/ char* JstringTochar(JNIEnv *env, jstring jstr) {char* rtn = NULL;jclass classtring = env->FindClass("java/lang/String");jstring strencode = env->NewStringUTF("GB2312");jmethodID mid = env->GetMethodID(classtring, "getBytes","(Ljava/lang/String;)[B");jbyteArray barr = (jbyteArray) env->CallObjectMethod(jstr, mid, strencode);jsize alen = env->GetArrayLength(barr);jbyte* ba = env->GetByteArrayElements(barr, JNI_FALSE);if (alen > 0) {rtn = (char*) malloc(alen + 1);memcpy(rtn, ba, alen);rtn[alen] = 0;}env->ReleaseByteArrayElements(barr, ba, 0);return rtn;}JNIEXPORT jstring Java_com_example_ndktest_JNIProvideer_hello(JNIEnv *env,jobject obj) {LOGD("%s", "haha");return env->NewStringUTF("Hello from JNI !");}/***2個整數相加***/JNIEXPORT jint Java_com_example_ndktest_JNIProvideer_add(JNIEnv *env,jobject obj,jint x,jint y){return x+y;}/***字串轉換***/JNIEXPORT jstring Java_com_example_ndktest_JNIProvideer_sayHello(JNIEnv *env,jobject obj,jstring jstr){char* p=JstringTochar(env,jstr);LOGI("sss%s",p);//strcat(p,helloWord)表示helloWord?拼接到p後面return env->NewStringUTF(strcat(p,"helloWord"));}/***整數數組每一個元素加10***/JNIEXPORT jintArray Java_com_example_ndktest_JNIProvideer_getIntArray(JNIEnv *env,jobject obj,jintArray jintarr){//擷取數組長度int len=env->GetArrayLength(jintarr);LOGI("len=%d",len);//擷取整數數組地址jint* arr=env->GetIntArrayElements(jintarr,0);for (int i=0;  i < len; i++) {*(arr+i)+=10;}return jintarr;}/***主動調用java對象中方法String getString() * ()Ljava/lang/String;表示參數為空白,傳回值為String***/JNIEXPORT void Java_com_example_ndktest_JNIProvideer_getJavaMethodForGetString(JNIEnv *env,jobject obj) {jclass classz=env->FindClass("com/example/ndktest/JNIProvideer");if(classz==0){LOGI("can‘t find class");}else{LOGI("find class");}jmethodID javaMethod=env->GetMethodID(classz,"getString","()Ljava/lang/String;");if(javaMethod==0){LOGI("can‘t find menthod");}else{LOGI("find menthod");}    jstring result= (jstring)env->CallObjectMethod(obj,javaMethod);char* p=JstringTochar(env,result);LOGI("result=%s",p);}/***主動調用java對象中方法int getAdd(int x,int y) * (II)I表示參數為2個整數,傳回值為整數***/JNIEXPORT void Java_com_example_ndktest_JNIProvideer_getJavaMethodForGetAdd(JNIEnv *env,jobject obj) {jclass classz=env->FindClass("com/example/ndktest/JNIProvideer");if(classz==0){LOGI("can‘t find class");}else{LOGI("find class");}jmethodID javaMethod=env->GetMethodID(classz,"getAdd","(II)I");if(javaMethod==0){LOGI("can‘t find menthod");}else{LOGI("find menthod");}int result= env->CallIntMethod(obj,javaMethod,7,7);LOGI("result=%d",result);}/***主動調用java對象中方法void getvoidMethod(String x) * (Ljava/lang/String;)V表示參數為String,傳回值為空白***/JNIEXPORT void Java_com_example_ndktest_JNIProvideer_getJavaMethodForGetvoidMethod(JNIEnv *env,jobject obj) {jclass classz=env->FindClass("com/example/ndktest/JNIProvideer");if(classz==0){LOGI("can‘t find class");}else{LOGI("find class");}jmethodID javaMethod=env->GetMethodID(classz,"getvoidMethod","(Ljava/lang/String;)V");if(javaMethod==0){LOGI("can‘t find menthod");}else{LOGI("找到方法");}env->CallVoidMethod(obj,javaMethod,env->NewStringUTF("abc"));}}

  

package com.example.ndktest;import android.util.Log;public class JNIProvideer {  static{  System.loadLibrary("ndkTest");  }  public native int add(int x,int y);  public native String sayHello(String s);  public native int[] getIntArray(int[] ints);  public native String hello();  public native void getJavaMethodForGetString();  public native void getJavaMethodForGetAdd();  public native void getJavaMethodForGetvoidMethod();  /**   *讓c語言主動調用的方法 * @return */public String getString(){  return "hello";  }/** *讓c語言主動調用的方法* @return*/  public int getAdd(int x,int y){  return x+y;  }  /**   * 讓c語言主動調用的方法  * @return  */    public void getvoidMethod(String x){          Log.i("test", "輸入值:"+x);    }}

  

package com.example.ndktest;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.Toast;public class MainActivity extends Activity {    public native String hello();@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.fragment_main);Button tx=  (Button) findViewById(R.id.test);tx.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {JNIProvideer jNIProvideer=new JNIProvideer();String result="";//result=jNIProvideer.hello();//int add=jNIProvideer.add(4, 5);//result=add+"";//int[] intarray=jNIProvideer.getIntArray(new int[]{3,5,5,4});//for (int i = 0; i < intarray.length; i++) {//result+=intarray[i];//}//result=jNIProvideer.sayHello("say:");//jNIProvideer.getJavaMethodForGetString();//jNIProvideer.getJavaMethodForGetAdd();jNIProvideer.getJavaMethodForGetvoidMethod();//Toast.makeText(getApplicationContext(), result, 0).show();}});}}

  

JNI學習2:android 調用C語言方法與C語言調用android方法

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.