利用安卓源码的例子程序编写调用JNI

在安卓工程源码的development/samples/SimpleJNI目录下,这是一个简单的JNI例子。

首先看里面的Android.mk:

#
# Copyright (C) 2008 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

# This makefile shows how to build a shared library and an activity that
# bundles the shared library and calls it using JNI.

TOP_LOCAL_PATH:= $(call my-dir)

# Build activity

LOCAL_PATH:= $(TOP_LOCAL_PATH)
include $(CLEAR_VARS)

LOCAL_MODULE_TAGS := samples

LOCAL_SRC_FILES := $(call all-subdir-java-files)

LOCAL_PACKAGE_NAME := SimpleJNI

LOCAL_JNI_SHARED_LIBRARIES := libsimplejni

LOCAL_PROGUARD_ENABLED := disabled

LOCAL_SDK_VERSION := current

LOCAL_DEX_PREOPT := false

include $(BUILD_PACKAGE)

# ============================================================

# Also build all of the sub-targets under this one: the shared library.
include $(call all-makefiles-under,$(LOCAL_PATH))

我们关注LOCAL_JNI_SHARED_LIBRARIES := libsimplejni这个属性,

在你本身的项目的Android.mk文件中的LOCAL_PACKAGE_NAME的下面加上这条属性,

且更改属性为自己想要的动态库的名字


将此工程的jni目录拷贝到工程src的同级目录下,并更改其中的Android.mk的

LOCAL_MODULE:= libsimplejni属性为自己想要更改的(之前更改)的名字。


然后在你的工程的某个类中(或新建一个类)添加静态方法

(按照例子来,具体你想怎么调用自己说了算哈)。

class Native {
    static {
    	// The runtime will add "lib" on the front and ".o" on the end of
    	// the name supplied to loadLibrary.
        System.loadLibrary("simplejni");
    }

    static native int add(int a, int b);
}
对应的library改成你自己修改的名字,同时记住将native.cpp中的

static const char *classPathName = 

"com/example/android/simplejni/Native";

改成在Java中写的Native方法里对应类的路径,抓log也能看出来不对的,不修改调不过去

最终动态库会生成在out/target/***/system/lib下,

这个直接放到system/lib下估计也能用,

我是放到对应的system/app目录下的lib/arm目录下的


不知Java的loadlibrary是按怎样规则去加载的————

我猜想是先寻找系统的几个路径后,在寻找自己对应安装目录下的(请大神指点)。



到此结束,这种JNI的调用方式和老的方式不一样,老的是生成相应的头文件,将方法加一大串的修饰,在这个例子中我们可以看到

static jint
add(JNIEnv *env, jobject thiz, jint a, jint b) {
int result = a + b;
    ALOGI("%d + %d = %d", a, b, result);
    return result;
}

具体的方法名很简单,通过注册相应的类和方法达到Java与c++的通信

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, classPathName,
                 methods, sizeof(methods) / sizeof(methods[0]))) {
    return JNI_FALSE;
  }

  return JNI_TRUE;
}

参与评论 您还未登录,请先 登录 后发表或查看评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页

打赏作者

Chris丶Su

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值