JNI函数调用失败解决办法
JNI函数调用失败
工作中遇到一个问题:JAVA 调用 JNI 函数失败。检查了 JNI 函数的函数名,没有问题。在网上搜了一下,说的是因为没有导出 JNI 函数,于是在网上找了个例子试了一下,仍然失败,请求大家指点,谢谢!
JAVA 工程代码:
JNI 函数实现代码:
Android.mk:
Application.mk:
工作中遇到一个问题:JAVA 调用 JNI 函数失败。检查了 JNI 函数的函数名,没有问题。在网上搜了一下,说的是因为没有导出 JNI 函数,于是在网上找了个例子试了一下,仍然失败,请求大家指点,谢谢!
JAVA 工程代码:
package com.example.hellojni;
import android.os.Bundle;
import android.widget.TextView;
import android.app.Activity;
import android.util.Log;
public class HelloJni extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView tv = new TextView(this);
tv.setText(stringFromJNI());
setContentView(tv);
}
public native String stringFromJNI();
static {
try
{
System.loadLibrary("hello-jni");
}
catch (Exception e)
{
Log.e("test", "error");
}
catch (Throwable e)
{
Log.e("test", "err");
}
}
}
JNI 函数实现代码:
#include <jni.h>
#include <string.h>
#include <android/log.h>
using namespace std;
jstring Java_com_example_hellojni_HelloJni_stringFromJNI(JNIEnv* env, jobject thiz)
{
return (env)->NewStringUTF("Hello from JNI !");
}
static JNINativeMethod const gMethods[] =
{
{ "stringFromJNI", "()Ljava/lang/String;", (void*) Java_com_example_hellojni_HelloJni_stringFromJNI }
};
jint JNI_OnLoad(JavaVM *jvm, void *reserved)
{
JNIEnv* env = NULL;
if (jvm->GetEnv((void**) &env, JNI_VERSION_1_4) != JNI_OK)
{
return -1;
}
jclass clazz = (env)->FindClass("com/example/hellojni/HelloJni");
if (clazz)
{
(env)->RegisterNatives(clazz, gMethods, sizeof(gMethods) / sizeof(gMethods[0]));
}
return JNI_VERSION_1_4;
}
void JNI_OnUnload(JavaVM *jvm, void *reserved)
{
return;
}
Android.mk:
LOCAL_PATH:=$(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= hello.cpp
LOCAL_LDLIBS += -llog -ldl
LOCAL_MODULE:=libhello-jni
LOCAL_PRELINK_MODULE := false
include $(BUILD_SHARED_LIBRARY)
Application.mk:
APP_ABI := armeabi