JNI--Android 和C++的相互調用之--Hello From CPP

Android項目右鍵Android Tools-->Add Native Support然後輸入JNI的名稱如:hello
項目目錄下邊就會創建jni的目錄
創建包:package com.example.jni
創建兩個類:CCallJava和JavaCallC
package com.example.jni;


public class JavaCallC {


 /**
  * sum a and b
  * 
  * @param a
  * @param b
  * @return sum
  */
 public static native int sum(int a, int b);


 /**
  * a reduce b
  * 
  * @param a
  * @param b
  * @return value
  */
 public static native int reduce(int a, int b);


}
package com.example.jni;


import android.util.Log;


public class CCallJava {
 /**
  * @param value
  * @return sum
  */
 public static void sum(int value, String s) {
 Log.d("CCallJava", "sum:" + value + "  s:" + s);
 }


 /**
  * @param value
  */
 public static void reduce(int value, String s) {
 Log.d("CCallJava", "reduce:" + value + "  s:" + s);
 }
}
在hello.cpp中添加代碼
#include <jni.h>
#include <string.h>
#include<stdio.h>


extern "C" {


jclass gCCallJavaClass;


JNIEXPORT jstring JNICALL Java_com_example_testjni_MainActivity_myhello(
 JNIEnv * env, jobject obj);
JNIEXPORT void JNICALL Java_com_example_jni_JavaCallC_sum(JNIEnv * env,
 jobject obj, jint a, jint b);
JNIEXPORT void JNICALL Java_com_example_jni_JavaCallC_reduce(JNIEnv * env,
 jobject obj, jint a, jint b);


};

//調用並C++層直接返回String的字符串
JNIEXPORT jstring JNICALL Java_com_example_testjni_MainActivity_myhello(
 JNIEnv * env, jobject obj) {
 return env->NewStringUTF("Hello From CPP");
}

//調用底層計算,並通過另外一個函數把結果返回到java層
JNIEXPORT void JNICALL Java_com_example_jni_JavaCallC_sum(JNIEnv * env,
 jobject obj, jint a, jint b) {
 printf("s%\n","Java_com_example_jni_JavaCallC_sum start");

//獲取結果返回的函數所在類
 jclass localRefCls = env->FindClass("com/example/jni/CCallJava");
 if(localRefCls==NULL){
 printf("s%\n","localRefCls==NULL");
 return;
 }

//獲取類對象
 gCCallJavaClass = (jclass) env->NewGlobalRef(localRefCls);
 env->DeleteLocalRef(localRefCls);


 if(gCCallJavaClass==NULL){
 printf("s%\n","gCCallJavaClass==NULL");
 return;
 }

//計算結果
 jint sum = a + b;
//獲取函數所在類的函數id
 jmethodID methodID =env->GetStaticMethodID(gCCallJavaClass, "sum","(ILjava/lang/String;)V");


 printf("s%\n","methodID");
 if (methodID == NULL) {
 printf("s%\n","methodID == NULL");


 } else {
//調用函數返回結果
 env->CallStaticVoidMethod(gCCallJavaClass, methodID, sum,env->NewStringUTF("Java_com_example_jni_JavaCallC_sum"));
 }
}

//該方法和上邊的方法一致
JNIEXPORT void JNICALL Java_com_example_jni_JavaCallC_reduce(JNIEnv * env,
 jobject obj, jint a, jint b) {
 printf("s%\n","Java_com_example_jni_JavaCallC_sum start");


 jclass localRefCls = env->FindClass("com/example/jni/CCallJava");
 if(localRefCls==NULL){
 printf("s%\n","localRefCls==NULL");
 return;
 }


 gCCallJavaClass = (jclass) env->NewGlobalRef(localRefCls);
 env->DeleteLocalRef(localRefCls);


 if(gCCallJavaClass==NULL){
 printf("s%\n","gCCallJavaClass==NULL");
 return;
 }


 jint sum = a - b;
 jmethodID methodID =env->GetStaticMethodID(gCCallJavaClass, "reduce","(ILjava/lang/String;)V");


 printf("s%\n","methodID");
 if (methodID == NULL) {
 printf("s%\n","methodID == NULL");


 } else {
 env->CallStaticVoidMethod(gCCallJavaClass, methodID, sum,env->NewStringUTF("Java_com_example_jni_JavaCallC_reduce"));
 }
}

調用:
TextView mTextView;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.main);
 mTextView = (TextView) findViewById(R.id.textView);
 mTextView.setText(myhello());
 String s;
 JavaCallC.sum(100, 100);
 JavaCallC.reduce(100, 123);
 }


 public native String myhello();


 static {
 System.loadLibrary("hello");
 }

結果:
sum:200  s:Java_com_example_jni_JavaCallC_sum
reduce:-23  s:Java_com_example_jni_JavaCallC_reduce
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章