android9.0 Java 静的ライブラリ操作 JNI インスタンスの動的登録

1. Java層

ソースコード

ディレクトリ: /Demo/java/com/android/simpleini/SimpleJNI.java


package com.example.simplejni;

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

public class SimpleJNI {
      private IpoManagerService(Context context) {
          nativeTest.LoadLibrary();
         if(nativeTest.mIsLoadNativeLibStatus){
            nativeTest.native_setIpoInitSuccFlag();
            Log.d(TAG, "nativeTest.native_setIpoInitSuccFlag");
        }else{
               Log.d(TAG,"nativeTest.mIsLoadNativeLibStatus="
                            +nativeTest.mIsLoadNativeLibStatus);
        }
    }
    
}


class nativeTest{
    private final static String TAG_LOG = "nativeTest";
    static void LoadLibrary(){
        try {
            System.loadLibrary("nativeTest");
            mIsLoadNativeLibStatus = true;
            Log.d(TAG_LOG, "loadLibrary nativeTestJni OK");
        } catch (UnsatisfiedLinkError e) {
            Log.e(TAG_LOG, "loadLibrary UnsatisfiedLinkError = " + e.toString());
        } catch (Exception e) {
            Log.e(TAG_LOG, "loadLibrary Exception = " + e.toString());
        }
    }
    static native  void native_setIpoInitSuccFlag();
    static boolean mIsLoadNativeLibStatus = false;


}

アンドロイド.bp

java_library_static {    名前: "SimpleJNI"、    ライブラリ: [        "xxx",    ]、    必須:[         "libnativeTest",    ],

   



   


   srcs: ["java/**/*.java"]、
   最適化: {        有効: false,    }, }


   

2、JNI層

コード

ソースコード: /demo/jni/nativeTest.cpp

/*
	third screen brightness adjustment
*/
#define LOG_TAG "JNI_NativeTest"
#if 0
#include "jni.h"
#include <nativehelper/JNIHelp.h>
#include "android_runtime/AndroidRuntime.h"

#include <utils/misc.h>
#include <cutils/log.h>

#include <stdio.h>
#include<sstream>

#include <android-base/properties.h>
#include<iostream>
#endif

#include <utils/Log.h>
#include <stdio.h>
#include <jni.h>
#include <nativehelper/JNIHelp.h>
#include <nativehelper/ScopedUtfChars.h>
#include <android_runtime/AndroidRuntime.h>
#include "core_jni_helpers.h"
#include <string.h>
#include <cutils/properties.h>


#define IPOINITOK_IPOMS_BSP_FIELPATH "/xx/xx/xx" //操作文件节点名称

static const char *kClassPathName = "com/android/simplejni/nativeTest";


static int write_int_to_bsp(char const* path, char* buffer, int bytes)
{
		int fd;
	
		if (path == NULL)
		{
		ALOGE("the path==NULL");
		return -1;
		}
	
		fd = open(path, O_RDWR);
		if (fd >= 0) {
			int amt = write(fd, buffer, bytes);
			close(fd);
			if(amt == -1)
			{
				ALOGE("write_int_to_bsp write [%s] failed! errno=%d", path,errno);
				return -errno;
			}
			else
			{
				ALOGI("write ok");
				return 0;
			}
		}
		else
		{
		ALOGE("write_int_to_bsp open [%s] failed! errno=%d", path,errno);
		return -errno;
		}

}
	
static void native_setIpoInitSuccFlag(JNIEnv *env, jobject thiz)
{
		char ipoinit_succ[1] = {1};
		ALOGD("enter JNI native_setIpoInitSuccFlag()");
		write_int_to_bsp(IPOINITOK_IPOMS_BSP_FIELPATH,ipoinit_succ,1);
}


static  JNINativeMethod methods[] = {
	{"native_setIpoInitSuccFlag", "()V", (void *)native_setIpoInitSuccFlag},
};

	/*
int register_com_mediatek_ipomanager_IpoManagerService(JNIEnv *env) {
	return jniRegisterNativeMethods(env, kClassPathName, method_table, NELEM(method_table));
}
*/

/*
* Register several native methods for one class.
*/
static int registerNativeMethods(JNIEnv* env, const char* className,
	JNINativeMethod* gMethods, int numMethods)
{
	jclass clazz;

	clazz = env->FindClass(className);
	if (clazz == NULL) {
		ALOGE("Native registration unable to find class '%s'", className);
		return JNI_FALSE;
	}
	if (env->RegisterNatives(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, kClassPathName,
				methods, sizeof(methods) / sizeof(methods[0]))) {
	return JNI_FALSE;
}

return JNI_TRUE;
}

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(&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;
}

アンドロイド.mk

パス: /demo/jni/android.mk

#

# Copyright (C) 2008 Android オープンソース プロジェクト

#

# Apache License バージョン 2.0 (「ライセンス」) に基づいてライセンスされています。

# ライセンスに準拠する場合を除き、このファイルを使用することはできません。

# ライセンスのコピーは次の場所で入手できます。

#

# http://www.apache.org/licenses/LICENSE-2.0

#

# 適用される法律で義務付けられている場合または書面による同意がない限り、ソフトウェア

# ライセンスに基づいて配布されるものは、「現状のまま」で配布されます。

# 明示的か黙示的かを問わず、いかなる種類の保証や条件もありません。

# 権限を管理する特定の言語についてはライセンスを参照してください。

# ライセンスに基づく制限。

#

# この Makefile は、JNI コードのライブラリを構築するためのルールを提供します。

# サンプル プラットフォーム共有ライブラリで使用します。

LOCAL_PATH:= $(私のディレクトリを呼び出します)

$(CLEAR_VARS) を含む

LOCAL_MODULE_TAGS := オプション

# これはビルド中のターゲットです。

LOCAL_MODULE:= libnativeTest

# コンパイルするすべてのソース ファイル。

LOCAL_SRC_FILES:= \

    ネイティブテスト.cpp

# リンク先のすべての共有ライブラリ。

LOCAL_SHARED_LIBRARIES := \

    libnativehelper \

    libutils\

    libutils\

    リブログ\

    libandroid_runtime

# 静的ライブラリはありません。

LOCAL_STATIC_LIBRARIES :=

# JNI ヘッダーも必要です。

LOCAL_C_INCLUDES += \

    $(JNI_H_INCLUDE)

LOCAL_CFLAGS += -Wall -Werror -Wunused-parameter -Wno-unused-parameter

$(BUILD_SHARED_LIBRARY) を含める




 

おすすめ

転載: blog.csdn.net/BersonKing/article/details/129183012