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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章