您的位置:首页 > 编程语言 > C语言/C++

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

2014-10-20 11:27 302 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: