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

2014-11-24 08:35:51 · 作者: · 浏览: 0

MainActivity.java

package com.example.jniload;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.TextView;

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		TextView  tv = new TextView(this);
        tv.setText( stringFromJNI() );
        setContentView(tv);
		//setContentView(R.layout.activity_main);
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}
	native String stringFromJNI();
	static{
		System.loadLibrary("jniload");
	}
}
test-jni.c

#include 
  
   
#include 
   
     #include 
    
      #include 
     
       # define NELEM(x) ((int) (sizeof(x) / sizeof((x)[0]))) #define JNIREG_CLASS "com/example/test/Test" JNIEXPORT jstring JNICALL stringFromJNI(JNIEnv *env, jclass clazzi) { return (*env)->NewStringUTF(env, "hello Android3."); } static JNINativeMethod method_table[] = { { "stringFromJNI", "()Ljava/lang/String;", (void*)stringFromJNI },//绑定 }; static int registerNativeMethods(JNIEnv* env, const char* className, JNINativeMethod* gMethods, int numMethods) { jclass clazz; clazz = (*env)->FindClass(env, className); if (clazz == NULL) { return JNI_FALSE; } if ((*env)->RegisterNatives(env, clazz, gMethods, numMethods) < 0) { return JNI_FALSE; } return JNI_TRUE; } int register_ndk_load(JNIEnv *env) { return registerNativeMethods(env, JNIREG_CLASS, method_table, NELEM(method_table)); } JNIEXPORT jint JNI_OnLoad(
      JavaVM* vm, void* reserved) { JNIEnv* env = NULL; jint result = -1; if ((*vm)->GetEnv(vm, (void**) &env, JNI_VERSION_1_4) != JNI_OK) { return result; } register_ndk_load(env); return JNI_VERSION_1_4; }
     
    
   
  
jni-load.cpp

#include 
  
   
#include 
   
     #include 
    
      #include 
     
       #include 
      
        #define NELEM(x) ((int) (sizeof(x) / sizeof((x)[0]))) #define JNIREG_CLASS "com/example/jniload/MainActivity" extern "C" /*jstring Java_com_example_jniload_MainActivity_stringFromJNI( JNIEnv* env,jobject thiz ) { char* str="Hello from JNI."; return (env)->NewStringUTF(str); }*/ JNIEXPORT jstring JNICALL stringFromJNI( JNIEnv* env,jobject thiz ) { char* str="Hello from JNI."; return (env)->NewStringUTF(str); } static JNINativeMethod method_table[] = { { "stringFromJNI", "()Ljava/lang/String;", (void*)stringFromJNI }, }; static int registerNativeMethods(JNIEnv* env, const char* className, JNINativeMethod* gMethods, int numMethods) { jclass clazz; clazz = env->FindClass(className); if (clazz == NULL) { return JNI_FALSE; } if (env->RegisterNatives(clazz, gMethods, numMethods) < 0) { return JNI_FALSE; } return JNI_TRUE; } int register_ndk_load(JNIEnv *env) { return registerNativeMethods(env, JNIREG_CLASS, method_table, NELEM(method_table)); } jint JNI_OnLoad(JavaVM* vm, void* reserved) { JNIEnv* env = NULL; jint result = -1; if (vm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK) { return result; } //result=register_ndk_load(env); if ( register_ndk_load(env) < 0){ goto bail; } result = JNI_VERSION_1_4; bail: return result; }