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
和
在hello.cpp中添加代码
调用:
结果:
sum:200 s:Java_com_example_jni_JavaCallC_sum
reduce:-23 s:Java_com_example_jni_JavaCallC_reduce
项目目录下边就会创建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
相关文章推荐
- Android JNI/NDK开发(2)JNI实现C/C++与Android/JAVA相互调用
- android jni C++ java 相互调用
- android-JNI学习之java和c++相互调用
- android-JNI学习之java和c++相互调用
- android C++和Java通过JNI机制相互调用
- android jni (2) java与c++相互调用
- 在Android中,通过JNI实现C++与Java相互调用
- 通过JNI实现Java和C++的相互调用(转)
- 通过JNI实现Java和C++的相互调用(转)
- JNI编程 —— 让C++和Java相互调用
- 通过JNI实现Java和C++的相互调用(转)
- 通过JNI实现Java和C++的相互调用(转)
- 通过JNI实现Java和C++的相互调用(转)
- 通过JNI实现Java和C++的相互调用(转)
- JNI编程 —— 让C++和Java相互调用
- 通过JNI实现Java和C++的相互调用(转)
- 通过JNI实现Java和C++的相互调用(转)
- 通过JNI实现Java和C++的相互调用(转)
- 通过JNI实现Java和C++的相互调用(转)