Android移植—JNI中HelloWorld的C和C++实现

MainActivity.java

[java] 
  1. package com.example.jniload;
  2. import android.os.Bundle;
  3. import android.app.Activity;
  4. import android.view.Menu;
  5. import android.widget.TextView;
  6. public class MainActivity extends Activity {
  7.     @Override
  8.     protected void onCreate(Bundle savedInstanceState) {
  9.         super.onCreate(savedInstanceState);
  10.         TextView  tv = new TextView(this);
  11.         tv.setText( stringFromJNI() );
  12.         setContentView(tv);
  13.         //setContentView(R.layout.activity_main);
  14.     }
  15.     @Override
  16.     public boolean onCreateOptionsMenu(Menu menu) {
  17.         // Inflate the menu; this adds items to the action bar if it is present.
  18.         getMenuInflater().inflate(R.menu.main, menu);
  19.         return true;
  20.     }
  21.     native String stringFromJNI();
  22.     static{
  23.         System.loadLibrary(“jniload”);
  24.     }
  25. }

test-jni.c

 

 

[cpp] 
  1. #include <jni.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <assert.h>
  5. # define NELEM(x) ((int) (sizeof(x) / sizeof((x)[0])))
  6. #define JNIREG_CLASS “com/example/test/Test”
  7. JNIEXPORT jstring JNICALL stringFromJNI(JNIEnv *env, jclass clazzi)
  8. {
  9.     return (*env)->NewStringUTF(env, “hello Android3.”);
  10. }
  11. static JNINativeMethod method_table[] = {
  12.     { “stringFromJNI”, “()Ljava/lang/String;”, (void*)stringFromJNI },//绑定
  13. };
  14. static int registerNativeMethods(JNIEnv* env, const char* className,
  15.         JNINativeMethod* gMethods, int numMethods)
  16. {
  17.     jclass clazz;
  18.     clazz = (*env)->FindClass(env, className);
  19.     if (clazz == NULL) {
  20.         return JNI_FALSE;
  21.     }
  22.     if ((*env)->RegisterNatives(env, clazz, gMethods, numMethods) < 0) {
  23.         return JNI_FALSE;
  24.     }
  25.     return JNI_TRUE;
  26. }
  27. int register_ndk_load(JNIEnv *env)
  28. {
  29.     return registerNativeMethods(env, JNIREG_CLASS,
  30.             method_table, NELEM(method_table));
  31. }
  32. JNIEXPORT jint JNI_OnLoad(JavaVM* vm, void* reserved)
  33. {
  34.     JNIEnv* env = NULL;
  35.     jint result = -1;
  36.     if ((*vm)->GetEnv(vm, (void**) &env, JNI_VERSION_1_4) != JNI_OK) {
  37.         return result;
  38.     }
  39.     register_ndk_load(env);
  40.     return JNI_VERSION_1_4;
  41. }

jni-load.cpp

 

 

[cpp] 
  1. #include <jni.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include <assert.h>
  6. #define NELEM(x) ((int) (sizeof(x) / sizeof((x)[0])))
  7. #define JNIREG_CLASS “com/example/jniload/MainActivity”
  8. extern “C”
  9. /*jstring Java_com_example_jniload_MainActivity_stringFromJNI( JNIEnv* env,jobject thiz )
  10. {
  11.     char* str=”Hello from JNI.”;
  12.     return (env)->NewStringUTF(str);
  13. }*/
  14. JNIEXPORT jstring JNICALL stringFromJNI( JNIEnv* env,jobject thiz )
  15. {
  16.     char* str=”Hello from JNI.”;
  17.     return (env)->NewStringUTF(str);
  18. }
  19. static JNINativeMethod method_table[] = {
  20.     { “stringFromJNI”, “()Ljava/lang/String;”, (void*)stringFromJNI },
  21. };
  22. static int registerNativeMethods(JNIEnv* env, const char* className,
  23.         JNINativeMethod* gMethods, int numMethods)
  24. {
  25.     jclass clazz;
  26.     clazz = env->FindClass(className);
  27.     if (clazz == NULL) {
  28.         return JNI_FALSE;
  29.     }
  30.     if (env->RegisterNatives(clazz, gMethods, numMethods) < 0) {
  31.         return JNI_FALSE;
  32.     }
  33.     return JNI_TRUE;
  34. }
  35. int register_ndk_load(JNIEnv *env)
  36. {
  37.    return registerNativeMethods(env, JNIREG_CLASS, method_table, NELEM(method_table));
  38. }
  39. jint JNI_OnLoad(JavaVM* vm, void* reserved)
  40. {
  41.     JNIEnv* env = NULL;
  42.     jint result = -1;
  43.     if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) {
  44.         return result;
  45.     }
  46.     //result=register_ndk_load(env);
  47.     if ( register_ndk_load(env) < 0){
  48.         goto bail;
  49.     }
  50.     result = JNI_VERSION_1_4;
  51. bail:
  52.     return result;
  53. }

标签