標籤:
#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方法