c++ - UnsatisfiedLinkError for native cpp function in Android app (ndk) -
i trying run easy android ndk app in cpp, unsatisfiedlink error generate() function.
any appreciated. quite fluent in c++, java little bit rusty. have been trying lot of tips web concerning naming, far no luck. here files:
native.cpp:
#include <string.h> #include <jni.h> jstring java_com_optimuse_app_optimuseappactivity_generate(jnienv* env, jobject thiz){ return env->newstringutf("hello jni !"); }
android.mk:
local_path := $(call my-dir) include $(clear_vars) local_module := native local_src_files := native.cpp include $(build_shared_library)
i compile ndk-build , goes well, provides me libnative.so, located in project directory. use eclipse rest.
optimuseappactivity.java:
package com.optimuse.app; import android.app.activity; import android.widget.textview; import android.os.bundle; public class optimuseappactivity extends activity { @override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); textview tv = new textview(this); tv.settext( generate() ); setcontentview(tv); } public native string generate(); static { system.loadlibrary("native"); } }
and automatically generated androidmanifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.optimuse.app" android:versioncode="1" android:versionname="1.0" > <uses-sdk android:minsdkversion="15" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:hascode="true"> <activity android:name="com.optimuse.app.optimuseappactivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.main" /> <category android:name="android.intent.category.launcher" /> </intent-filter> </activity> </application> </manifest>
thank suggestions, been searching few hours now!
you running c++ name mangling. example, here objdump -t on library gives when build hello-jni.c:
00000c28 g df .text 0000002c java_com_example_hellojni_hellojni_stringfromjni
and here's if translate c++ in way did:
00000c94 g df .text 00000024 _z48java_com_example_hellojni_hellojni_stringfromjnip7_jnienvp8_jobject
to prevent mangling , make them visible jni, declare native functions within extern "c" {} block, ie
#include <string.h> #include <jni.h> extern "c" { jstring java_com_optimuse_app_optimuseappactivity_generate(jnienv* env, jobject thiz); } jstring java_com_optimuse_app_optimuseappactivity_generate(jnienv* env, jobject thiz){ return env->newstringutf("hello jni !"); }
Comments
Post a Comment