Android电视下的JNI demo

参考文章:
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.so
Install: out/target/product/xxxx/system/app/MyJNI/MyJNI.apk

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

TOP_LOCAL_PATH:= $(call my-dir)
# Build activity
LOCAL_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 := MyJNI
LOCAL_JNI_SHARED_LIBRARIES := libjnitext
LOCAL_PROGUARD_ENABLED := disabled
LOCAL_SDK_VERSION := current
include $(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 := optional
LOCAL_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 liblog
include $(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);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值