Android电视下的JNI demo

来源:互联网 发布:金融数据库软件 编辑:程序博客网 时间:2024/05/18 11:50

参考文章:
https://my.oschina.net/innost/blog/486594
http://www.cnblogs.com/larrylawrence/p/3898782.html

这几天学习下Android JNI demo,编译ok,记录下便于查询。
1、TV项目android code或是android 源码/linux系统(Ubuntu12.0.4)
2、动态注册JNI 函数(JNI_OnLoad)
3、package name:myjni,两个java文件,一个c文件,两个Android.mk文件,一个AndroidManifest.xml文件
4、编译位置:android\lollipop\device\xxxx\xxxx\app\,这个路径是本地路径,其他人的可能不一样,位于device路径下面,JNI的例子也可以参照development/samples/SimpleJNI,或是放到samples下面进行编译。
5、linux下编译过程中的error:jni下面如果是c++文件就用env->,若用的c文件,则用(*env)->,而且引用的函数里要多加一个参数env,不然会报错,vm指针的话类似。比如: error: too few arguments to function ‘(*env)->FindClass,在下文8中clazz = (*env)->FindClass(env,className)。
6、编译命令:
android\lollipop下面:
source build/envsetup.sh;
有些可能需要在lunch + ANDROIDLUNCHNAME;
mm -B;

7、生成的文件:

Install: out/target/product/xxxx/system/lib/libjnitext.soInstall: out/target/product/xxxx/system/app/MyJNI/MyJNI.apk

8、编译文件内容:
app/MyJNI/下面的Android.mk内容:

TOP_LOCAL_PATH:= $(call my-dir)# Build activityLOCAL_PATH:= $(TOP_LOCAL_PATH)include $(CLEAR_VARS)LOCAL_MODULE_TAGS := optional# Only compile source java files in this apk.LOCAL_SRC_FILES := $(call all-subdir-java-files)LOCAL_PACKAGE_NAME := MyJNILOCAL_JNI_SHARED_LIBRARIES := libjnitextLOCAL_PROGUARD_ENABLED := disabledLOCAL_SDK_VERSION := currentinclude $(BUILD_PACKAGE)# Use the following include to make our test apk.include $(call all-makefiles-under,$(LOCAL_PATH))

AndroidManifest.xml里的内容:

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="com.example.xxxx.myjni">    <application  android:label="Main Activity">        <activity android:name="MainActivity">            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>    </application></manifest>

jni文件夹下面:JNITest.c和Android.mk
JNITest.c内容:
xxxx是指package name

#define LOG_TAG "myjni JNITest.c"#include <utils/Log.h>#include <stdio.h>#include <string.h>/* DO NOT EDIT THIS FILE - it is machine generated */#include "jni.h"/*#include <com_example_xxxx_myjni_JNITest.h>*//* Header for class com_example_xxxx_myjni_JNITest *//* * Class:     com_example_xxxx_myjni_JNITest * Method:    getCLangString * Signature: ()Ljava/lang/String; */static jstring getCLangString(JNIEnv *env, jobject objt)  {    return (*env)->NewStringUTF(env,"This is JNItest!");  }/*JNIEXPORT jint JNICALL Java_com_example_xxxx_myjni_JNITest_addint        (JNIEnv *env, jobject objt, jint a, jint b){      int c=a+b;      return c;}*/static const char *classPathName = "com/example/xxxx/myjni/JNITest";  static JNINativeMethod methods[] = {  {"getCLangString", "()Ljava/lang/String", (void*)getCLangString },};/* * Register several native methods for one class. */static int registerNativeMethods(JNIEnv* env, const char* className,    JNINativeMethod* gMethods, int numMethods){    jclass clazz;    clazz = (*env)->FindClass(env,className);    if (clazz == NULL) {        ALOGE("Native registration unable to find class '%s'", className);        return JNI_FALSE;    }    if ((*env)->RegisterNatives(env,clazz, gMethods, numMethods) < 0) {        ALOGE("RegisterNatives failed for '%s'", className);        return JNI_FALSE;    }    return JNI_TRUE;}/* * Register native methods for all classes we know about. * * returns JNI_TRUE on success. */static int registerNatives(JNIEnv* env){  if (!registerNativeMethods(env, classPathName,                 methods, sizeof(methods) / sizeof(methods[0]))) {    return JNI_FALSE;  }  return JNI_TRUE;}/* * This is called by the VM when the shared library is first loaded. */ typedef union {    JNIEnv* env;    void* venv;} UnionJNIEnvToVoid;jint JNI_OnLoad(JavaVM* vm, void* reserved){    UnionJNIEnvToVoid uenv;    uenv.venv = NULL;    jint result = -1;    JNIEnv* env = NULL;        ALOGI("JNI_OnLoad");    if ((*vm)->GetEnv(vm,&uenv.venv, JNI_VERSION_1_4) != JNI_OK) {        ALOGE("ERROR: GetEnv failed");        goto bail;    }    env = uenv.env;    if (registerNatives(env) != JNI_TRUE) {        ALOGE("ERROR: registerNatives failed");        goto bail;    }    result = JNI_VERSION_1_4;    bail:    return result;}

jni/Android.mk的内容

LOCAL_PATH:= $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE_TAGS := optionalLOCAL_MODULE := libjnitext#LOCAL_PACKAGE_NAME := MyJNI# Also need the JNI headers.LOCAL_C_INCLUDES += \$(JNI_H_INCLUDE)LOCAL_SRC_FILES := JNITest.c# All of the shared libraries we link against.LOCAL_SHARED_LIBRARIES := \libutils libloginclude $(BUILD_SHARED_LIBRARY)

myjni下面的两个java文件
xxxx是指package name
JNITest.java内容:

package com.example.xxxx.myjni;public class JNITest {    static {        System.loadLibrary("jnitext");   //defaultConfig.ndk.moduleName    }    public native String getCLangString();}

MainActivity.java内容

package com.example.xxxx.myjni;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.widget.TextView;import android.widget.Toast;public class MainActivity extends Activity {    private TextView textView,textView2;    //private Button button1;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        //setContentView(R.layout.activity_main);         TextView tv = new TextView(this);        //textView = (TextView)findViewById(R.id.jnitest1);        JNITest jniTest=new JNITest();        tv.setText(jniTest.getCLangString());        setContentView(tv);    }}
1 0
原创粉丝点击